Как издеваться над унаследованными методами - PullRequest
2 голосов
/ 30 октября 2011

Я пытаюсь смоделировать метод, который не унаследован от родительского класса, который является универсальным.Правильно знаю, мой код выглядит следующим образом.

public interface IBaseRepository<T>
{
    IEnumerable<T> FindMany(Func<T, bool> condition);
}

public interface IPersonRepository : IBaseRepository<person>
{
    //Here I got some specifics methods for person repository
}

Мой тестовый код выглядит следующим образом:

    private IPersonRepository mockPersonRepository { get; set; }

    [TestMethod]
    public void TestMehtod()
    {
        LogonModel model = CreateLogonModel("test@test.com", "test", "Index");
        person p = new person() { Email = model.Email, password = model.Password, PersonId = 1 };

        mockPersonRepository.Stub(x => x.FindMany(y => y.Email == model.Email && y.password == model.Password)).Return(new List<person> {p});
        mockPersonRepository.Replay();

        var actual = instanceToTest.LogOnPosted(model) as PartialViewResult;

        Assert.AreEqual("_Login", actual.ViewName);
    }

Когда я использую инструмент отладки в версии 2010, я могу видеть, что я, Stubне работает, возвращаемый человек всегда нулевой.Я объявил метод FindMany как виртуальный.

Кто-нибудь знает, как заглушить этот метод?Я использую RhinoMocks.

1 Ответ

2 голосов
/ 31 октября 2011

Проблема в том, что вы сравниваете лямбду - но вы действительно заинтересованы в том, чтобы экземпляр person, передаваемый в лямбду , соответствовал вашему person объекту на основе удовлетворения условия предиката - вы можетеиспользуйте Matches() для достижения этого, просто выполнив предикат для p - если это равно true, то у вас есть совпадение и вы должны вернуть список с заглушками:

mockPersonRepository.Stub(x => x.FindMany(Arg<Func<person, bool>>.Matches( y => y(p))))
                    .Return(new List<person> { p });
...