这是一个使用 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 中的事件订阅。
  • 但是这是正常情况,例如在 ModelViewPresenter 模式中,我很想知道是否有推荐的方法来做到这一点?
  • 另外,我不喜欢测试装置中的多个测试由于外部测试驱动的更改而失败的方式?我在测试设计气味国家吗?
  • 最佳答案

    我确实同意 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/

    10-12 22:37