Насмешка над одним и тем же интерфейсом более одного раза в 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
    }
}

Если я отлажу код, я обнаружу, что два объекта имеют один и тот же идентификатор.

Изображение мока IDoSomething с теми же идентификаторами

Я понимаю, что это может быть больше связано с плохой абстракцией, но было бы очень полезно в текущем положении нашего проекта, если бы это можно было обойти.

Спасибо заранее.


person Matt Canty    schedule 02.10.2014    source источник
comment
К вашему сведению, в настоящее время я изучаю, может ли этот ответ решить мою проблему stackoverflow.com/a/3882743/966609   -  person Matt Canty    schedule 02.10.2014
comment
выше вроде не помогло   -  person Matt Canty    schedule 02.10.2014


Ответы (1)


Оказывается, сложность приложений меня сбила с толку.

На самом деле я был проблемой равенства. Параметры, которые я ожидаю, представляют собой сложные объекты, которые на самом деле не соответствуют 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);

Сделанный.

person Matt Canty    schedule 02.10.2014
comment
Если кто-нибудь может ответить, почему переопределение методов Equals() и GetHashCode() не помогает, я хотел бы услышать, почему. - person Matt Canty; 02.10.2014