使用rhino mocks对通用存储库进行单元测试

时间:2011-01-09 21:13:48

标签: unit-testing repository rhino-mocks

为什么这个测试失败了?

    [TestMethod]
    public void Can_show_next_event()
    {
        // Arrange 

        var eventsRepo = MockRepository.GenerateStub<IRepository<Event>>();

        Event nextEvent = new Event{ 
                                       ID = 2, 
                                       Title = "Test Event", 
                                       Date = DateTime.Now.AddDays(2) 
                                    };

        eventsRepo.Stub(x => x.Find(y => y.Date > DateTime.Now))
                  .Return(nextEvent);

        // Act
        var controller = new EventsController(eventsRepo);
        var result = controller.Index() as ViewResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Details", result.ViewName);

    }

测试在最后一行失败,似乎存储库没有返回我想要的东西。

这是索引动作

public ActionResult Index()
{
    var model = _eventsRepo.Find(x => x.Date > DateTime.Now);
    return model != null ? View("Details", model) : View("NoEvents");
}

这是我的通用存储库接口

public interface IRepository<T> where T: class
{
    IQueryable<T> GetAll();
    IEnumerable<T> GetAll(Expression<Func<T, bool>> predicate);
    T GetById(int id);
    T Find(Expression<Func<T, bool>> predicate);
    void Add(T item);
    void Delete(T item);
    void Save();
}

我是嘲笑犀牛的新手,我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

尝试在此行添加.IgnoreParameters():

eventsRepo.Stub(x => x.Find(y => y.Date > DateTime.Now))
                  .IgnoreParameters()
                  .Return(nextEvent);

两个旁注:你的函数"T Find(Expression<Func<T,bool>> predicate)

可以使用Predicate<T>代替Func<T,bool>。两者基本相同。

如果您还没有,请获取Manning的Roy Osherove所着的“The Unit of Unit Testing”一书。 http://www.manning.com/osherove/

他使用Rhino.Mocks提供了几个单元测试样本的章节