这是一个使用 Rhino Mocks 的绿色测试套件。
[SetUp]
public void BeforeEachTest()
{
_mocksRepo = new MockRepository();
_mockBank = _mocksRepo.StrictMock<IBank>();
//_mockPrinter = _mocksRepo.StrictMock<IPrinter>();
_mockPrinter = _mocksRepo.DynamicMock<IPrinter>();
_mockLogger = _mocksRepo.StrictMock<ILog>();
_testSubject = new CrashTestDummy(DUMMY_NAME, _mockPrinter, _mockLogger);
}
[TearDown]
public void AfterEachTest()
{
_mocksRepo.ReplayAll(); // 2nd call to ReplayAll does nothing. Safeguard check
_mocksRepo.VerifyAll();
}
[Test]
public void Test_ConstrainingArguments()
{
_mockPrinter.Print(null);
LastCall.Constraints(Text.StartsWith("The current date is : "));
_mocksRepo.ReplayAll();
_testSubject.PrintDate();
}
现在要在另一个夹具中进行绿色测试,我必须对 ctor 稍作更改 - 订阅打印机界面中的事件。这导致上述测试装置中的所有测试都变为红色。
public CrashTestDummy(string name, IPrinter namePrinter, ILog logger)
{
_printer = namePrinter;
_name = name;
_logger = logger;
_printer.Torpedoed += KaboomLogger; // CHANGE
}
NUnit 错误选项卡显示
LearnRhinoMocks.Rhino101.Test_ConstrainingArguments:
TearDown : System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> Rhino.Mocks.Exceptions.ExpectationViolationException : IPrinter.add_Torpedoed(System.EventHandler`1[LearnRhinoMocks.MyEventArgs]); Expected #1, Actual #0.
解决此问题的方法是将从
Setup()
创建测试主题的行移动到测试中的 ReplayAll()
行下方。 Rhino mocks 认为你已经设置了一个事件订阅作为期望。然而,这个修复意味着每个测试中的(一些)重复。每个测试通常会在调用 ReplayAll 之前添加一些期望。
我知道这是一个特定的场景,它涉及测试主题 ctor 中的事件订阅。
最佳答案
我确实同意 Mark 使用显式设置而不是隐式设置。但是关于RhinoMocks的使用,你有没有试过下面的东西。您可以将模拟暂时置于重放模式并稍后恢复录制。就像是:
SetupResult.For(_mockPrinter...);
_mocksRepo.Replay(_mockPrinter);
_testSubject = new CrashTestDummy(DUMMY_NAME, _mockPrinter, _mockLogger);
_mocksRepo.BackToRecord(_mockPrinter, BackToRecordOptions.None);
关于unit-testing - 如何使用 Rhino Mocks 的记录重放模式避免设置代码重复?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1496342/