如何模拟继承的方法

时间:2011-10-30 19:44:19

标签: c# model-view-controller unit-testing rhino-mocks

我试图模仿一个从泛型的父类继承的方法。对,知道我的代码看起来像这样。

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

当我在vs 2010中使用调试工具时,我可以认为我是Stub,不起作用,返回者总是为空。我已将FindMany方法声明为虚拟。

有人知道如何存根该方法吗?我正在使用RhinoMocks。

1 个答案:

答案 0 :(得分:2)

问题是你正在比较lambda - 但是你真的很想让传递给lambda的person实例匹配你的person对象,这是基于满足谓词条件 - 您可以使用Matches()来实现这一点,只需执行p上的谓词 - 如果它等于true而不是匹配并且应该返回存根列表:

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