在Rhino中多次模拟相同的界面

时间:2014-10-02 10:45:57

标签: c# testing mocking rhino-mocks

我想多次模拟同一个界面。下面的代码演示了我认为阻止我的行为。

我已阅读并无法找到解决方法。似乎没有办法区分_mockOne和_mockTwo。

public interface IDoSomething
{
}

[TestFixture]
class RhinoTest
{
    private IDoSomething _mockOne;
    private IDoSomething _mockTwo;

    [SetUp]
    public void SetUp()
    {
        _mockOne = MockRepository.GenerateMock<IDoSomething>();
        _mockTwo = MockRepository.GenerateMock<IDoSomething>();

        var somethings = new Dictionary<string, IDoSomething>
                         {
                             {"one", _mockOne},
                             {"two", _mockTwo}
                         };

        //Pass this dictionary to a constructor for use in tests
    }
}

如果我调试代码,我发现这两个对象具有相同的标识符。

Image of IDoSomething mocks with same identifiers

我意识到这可能更多地与糟糕的抽象有关,但如果有解决方法的话,它对我们项目的当前位置非常有帮助。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

原来我被应用程序复杂性抛弃了。

我实际上是一个平等问题。我期待的参数是复杂的对象,它实际上使Assert.AreEqual(...);

失败

希望在同样的情况下加快其他人的速度。这是失败的测试

[Test]
public void Test()
{
    var expectedInput = new Object1 { DeeperObject = new Object2 { MyString = "Hello World" } };

    const string expectedOutput = "Hello Matt!";

    _mockOne.Expect(s => s.ReturnSomething(expectedInput))
            .Return(expectedOutput);

    var actualInput = new Object1 { DeeperObject = new Object2 { MyString = "Hello World" } };

    var actualOutput = _mockOne.ReturnSomething(actualInput);

    Assert.NotNull(actualOutput);
}

要解决此问题,参数属性需要专门匹配。

将以_mockOne.Expect开头的行替换为:

_mockOne.Expect(s => s .ReturnSomething(Arg<Object1> .Matches(o => o.DeeperObject.MyString == expectedInput.DeeperObject.MyString))) .Return(expectedOutput);

完成。