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

发布于 2024-10-11 07:06:53 字数 1485 浏览 2 评论 0 原文

为什么这个测试失败了?

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

我是用犀牛进行模拟的新手,我做错了什么?

提前致谢

Why is this test failing?

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

    }

The test fails on the last line, seem the Repository is not returning what I want it too.

here's the index action

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

here's my generic repository interface

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

I'm new to mocking with rhino, what am I doing wrong?

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转角预定愛 2024-10-18 07:06:53

尝试在这一行添加 .IgnoreParameters() :

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

两个旁注:您的函数 "T Find(Expression> predicate)"

可以只使用 Predicate ; 而不是 Func。两者基本相同。

如果您还没有,请获取 Manning 的 Roy Osherove 所著的《单元测试的艺术》一书。
http://www.manning.com/osherove/

他使用以下内容提供了几章的单元测试示例犀牛模拟

Try adding .IgnoreParameters() on this line:

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

Two side notes: your function "T Find(Expression<Func<T,bool>> predicate)"

could just use a Predicate<T> instead of a Func<T,bool>. The two are basically the same.

If you don't already have it, get a copy of the book "The Art of Unit Testing" by Roy Osherove from Manning.
http://www.manning.com/osherove/

He provides several chapters worth of unit testing samples using Rhino.Mocks

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文