我只是参与最小起订量和单元测试,如果这看起来很明显,请原谅我(通过 SO 快速搜索并没有向我显示类似的内容)。
我与以下提议的成员有一个接口(interface):
void AddFeed(Feed feed);
我想为此功能编写一个单元测试。测试类有一个 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;
}
应该如何修改模拟存储库声明以包含这种新的所需行为,或者我应该创建一个不同的最小起订量(以及如何完成)。
我的假设是,在创建模拟之后,派生单元测试会容易得多,但非常感谢提示。
非常感谢,
KevDog
最佳答案
我还假设您会像这样使用 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 接口(interface)交互。
如果您想测试 IFeedRepository 接口(interface)的使用情况,那么只需执行一些简单的操作,例如
[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.
}
有关断言是否调用了方法的提示,请参阅 Using Moq to determine if a method is called
希望对你有帮助
关于unit-testing - 如何为 Moq 和 Linq-to-Sql 编写 CRUD 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/528689/