c# - Rhino Mocks Stub 返回时的不同实例

标签 c# .net tdd mocking rhino-mocks

我正在寻找一种让我的测试更清晰的方法,这就是问题所在:

public interface A
{

}

public interface B
{
    A GetA();
}

现在,如果我想在 B 上有一个 stub ,并且每次调用 GetA 时都有一个新实例,我会这样做:

[Test]
public void TestName()
{
     MockRepository mockery = new MockRepository();

     B b = mockery.Stub<B>();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();
     b.Stub(x => x.GetA()).Return(mockery.Stub<A>()).Repeat.Once();

     mockery.ReplayAll();

     Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

请注意,在 assert 中我调用了 GetA 两次,并将结果设置为 Repeat.Once() 而不是 Repeat.Twice();

如果您运行此测试,它将通过,因为实例不同。但是,我觉得这段代码不是很清楚。你如何让 Rhino Mocks 在每次调用时生成新实例?

注意: 过去我使用过很多技巧,比如在每次返回时使用 Do() 来执行一些更改实例的代码等等,但是有没有类似 .GenerateNewInstance() 或类似的东西?

最佳答案

[Test]
public void TestName()
{
      var b = MockRepository.GenerateStub<B>();
      b.Stub(x => x.GetA())
          .WhenCalled(x => x.ReturnValue = MockRepository.GenerateStub<A>());

      Assert.IsFalse(ReferenceEquals(b.GetA(), b.GetA()));
}

在某些情况下,您必须显式添加 .Return() 调用,但如果您在 WhenCalled 中设置 ReturnValue,该值将被覆盖> 委托(delegate)参数。

关于c# - Rhino Mocks Stub 返回时的不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6468073/

相关文章:

python 单元测试我的密码验证代码

c# - 我如何遵循 .Net Native 神秘的堆栈跟踪?

C# MVC 4 ASP.net,如何将文件插入数据库存储(二进制)

.net - 在没有 Visual Studio 2010 的 Build Machine 中通过 MSbuild 发布

c# - 使用 Visual State Manager 重新模板化内置 WPF 控件

c# - 为什么一个空字符串连接到一个非空字符串评估为空?

ruby - VIM中映射命令时的文件补全

ruby - Gem 中的测试需要测试迁移生成器并为测试应用迁移

c# - 带有光滑圆角的标签

c# - configSource 在 system.serviceModel *或其子部分中不起作用