当前位置:  开发笔记 > 数据库 > 正文

如何为Moq和Linq-to-Sql编写CRUD单元测试

如何解决《如何为Moq和Linq-to-Sql编写CRUD单元测试》经验,为你挑选了1个好方法。

我刚刚参与了Moq和单元测试,所以请原谅我,如果这看起来很明显(通过SO的快速搜索并没有向我展示这样的东西).

我有一个与以下提议成员的接口:

void AddFeed(Feed feed);

我想为此功能编写单元测试.测试类有一个Moq Repository,声明如下:

static IFeedRepository MockFeedsRepository(params Feed[] feeds)
    {
        var mockFeedsRepository = new Moq.Mock();
        mockFeedsRepository.Expect(x => x.Feeds).Returns((feeds.AsQueryable));

        return mockFeedsRepository.Object;
    }

如何修改模拟存储库声明以包含这个新的期望行为,或者我应该创建一个不同的Moq(以及如何完成).

我的假设是,在创建模拟之后,派生单元测试会更容易,但提示非常受欢迎.

非常感谢,

KevDog



1> Richard Bank..:

我也假设你会像这样使用AddFeed方法

Feed myNewFeed = new Feed();
feedRepository.Add(myNewFeed);

并且你没有像这样使用它(设计很差)

IFeedRepository feedRepository = new FeedRepository();
Feed myNewFeed = new Feed(feedRepository);
...
myNewFeed.Save();

我猜你会想要测试这样的测试:

[Test]
public void TheTest()
{
  IFeedRepository repository = MockFeedsRepository({feed1, feed2, feed3});
  Feed newFeed = new Feed();
  repository.Add(newFeed);
  Assert.AreEqual(4,repository.Count());
}

如果是这种情况,那么测试实际上并不测试除了模拟内存存储库的实现之外的任何其他内容.这是你真正需要做的吗?

我建议您要做的是测试存储库的L2Sql实现,或者测试类如何与IFeedRepository接口交互.

如果你想测试IFeedRepository接口的用法,那就做一些简单的事情吧

[Test]
public void TheTest()
{
      IFeedRepository repository = Moq.Mock();
      Feed newFeed = new Feed();
      repository.Expect(r => r.Add(newFeed)); //no return as it's a void method
      //repository.Expect(r => r.Add(newFeed)).Throws(new ApplicationException()); --Test handing of exceptions

      //Code to hit the .Add() method

      //Assert the Add method was called.
}

有关断言是否调用方法的提示,请参阅使用Moq确定是否调用方法

我希望有所帮助

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有