Как мне сказать моему макету / заглушке абстрактного класса использовать его переопределение Object.Equals ()? - PullRequest
4 голосов
/ 17 марта 2012

У меня относительно простой абстрактный класс.Я еще больше упростил этот вопрос для этого вопроса.

public abstract class BaseFoo
{
    public abstract string Identification { get; }
    //some other abstract methods

    public override bool Equals(object obj)
    {
        BaseFoo other = obj as BaseFoo;
        if(other == null)
        {
            return false;
        }
        return this.Identification.Equals(other.Identification);
    }
}

Я пытаюсь выяснить, как написать модульный тест, чтобы убедиться, что объект равен переопределению.Я попытался создать макет, но когда я приводил макет как объект и вызывал Equals, он не вызывает мой код в абстрактном классе.Это просто сразу возвращает ложь.То же самое, если я добавлю его в список объектов и вызову .Remove или .Contains в списке;все еще просто возвращает false, не нажимая код в моем абстрактном классе.

Я использую motest для mstest и rhino.

Для полноты, вот тест, который я ожидал бы работать, но нет:

[TestMethod]
public void BaseFoo_object_Equals_returns_true_for_Foos_with_same_Identification()
{
    var id = "testId";
    var foo1 = MockRepository.GenerateStub<BaseFoo>();
    var foo2 = MockRepository.GenerateStub<BaseFoo>();
    foo1.Stub(x => x.Identification).Return(id);
    foo2.Stub(x => x.Identification).Return(id);
    Assert.IsTrue(((object)foo1).Equals(foo2));
}

1 Ответ

1 голос
/ 17 марта 2012

Конечно, я понял это сразу после того, как отправил вопрос ...

Я не знаю, правильно ли это делать, но похоже, что это работает. Я сказал заглушку .CallOriginalMethod ()

[TestMethod]
public void BaseFoo_object_Equals_returns_true_for_Foos_with_same_Identification()
{
    var id = "testId";
    var foo1 = MockRepository.GenerateStub<BaseFoo>();
    var foo2 = MockRepository.GenerateStub<BaseFoo>();
    foo1.Stub(x => x.Identification).Return(id);
    foo2.Stub(x => x.Identification).Return(id);
    foo1.Stub(x => ((object)x).Equals(Arg<object>.Is.Anything)).CallOriginalMethod(OriginalCallOptions.NoExpectation);
    Assert.IsTrue(((object)foo1).Equals(foo2));
}
...