2014-10-02 44 views
0

我想多次模拟相同的界面。下面的代码演示了我认为阻止我的方式。在Rhino中嘲笑相同的界面不止一次

我已阅读并找不到解决方案。这似乎没有办法区分_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

我意识到这可能是更抽象与贫穷做,但如果有办法解决这将是我们项目的当前位置真的很有帮助。

非常感谢提前。

+0

仅供参考,我目前正在调查这个答案是否能解决我的问题http://stackoverflow.com/a/3882743/966609 – 2014-10-02 11:07:24

+0

上面似乎并没有帮助 – 2014-10-02 12:56:23

回答

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);

完成。

+0

如果任何人都可以回答为什么重写'的equals() '和'GetHashCode()'方法没有帮助我想知道为什么。 – 2014-10-02 14:09:01