代码之家  ›  专栏  ›  技术社区  ›  KevDog

如何将Moq和Linq的CRUD单元测试写入Sql

  •  3
  • KevDog  · 技术社区  · 17 年前

    我只是在参与Moq和单元测试,所以如果这看起来很明显,请原谅我(快速搜索,所以没有显示类似的内容)。

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

    void AddFeed(Feed feed);
    

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

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

    我的假设是,在创建mock之后,导出单元测试会容易得多,但是非常感谢您的提示。

    非常感谢,,

    凯夫多格

    1 回复  |  直到 17 年前
        1
  •  9
  •   Community Mohan Dere    6 年前

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

    有关断言是否调用了方法的提示,请参阅 Using Moq to determine if a method is called

    推荐文章