3

我只是参与起订量和单元测试,所以如果这看起来很明显,请原谅我(通过 SO 快速搜索并没有向我显示类似的东西)。

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

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

应该如何修改模拟存储库声明以包含这种新的所需行为,或者我应该创建一个不同的起订量(以及如何完成)。

我的假设是,在创建模拟之后,派生单元测试会容易得多,但非常感谢提示。

非常感谢,

凯夫狗

4

1 回答 1

9

我还假设您会像这样使用 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<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.
}

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

我希望这会有所帮助

于 2009-02-10T01:44:37.910 回答