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

Kev*_*Dog 3 unit-testing moq irepository .net-3.5

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

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

void AddFeed(Feed feed);
Run Code Online (Sandbox Code Playgroud)

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

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

        return mockFeedsRepository.Object;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢,

KevDog

Ric*_*nks 9

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

Feed myNewFeed = new Feed();
feedRepository.Add(myNewFeed);
Run Code Online (Sandbox Code Playgroud)

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

IFeedRepository feedRepository = new FeedRepository();
Feed myNewFeed = new Feed(feedRepository);
...
myNewFeed.Save();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

[Test]
public void TheTest()
{
      IFeedRepository repository = Moq.Mock<IFeedRepository>();
      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.
}
Run Code Online (Sandbox Code Playgroud)

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

我希望有所帮助