模拟存储库模式的最佳实践

时间:2011-06-08 06:30:10

标签: moq

我开始使用IoC / Mocking,我希望确保我的存储库使用'最佳实践'。

我正在为我的存储库设置接口。具体实现将指向SQL,而测试将使用Moq生成“假货”。我注意到我正在使用Moq的回调功能 lot 。在this文章中,作者说。

  

由于Moq为您希望做的大多数事情提供了这两个领域的功能,因此您需要这些工具并没有太多不同的点。事实上,如果你认为你需要使用“回调”,那么你应该看看Moq是否可以自动完成你想做的事情。

我已经看过了,看不到任何其他方法来实现我需要的东西 - 即'假的'存储库。有人可以告诉我这里有什么东西吗?没有回调,有没有办法实现这个目标?

public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        // Arrange
        var mock = ContactRepositoryFake();

        // Act
        mock.Object.AddContact(new Contact() { Name = "bill" });
        mock.Object.AddContact(new Contact() { Name = "jane" });

        // Assert
        Assert.IsTrue(mock.Object.AllContacts.Count() == 2);
    }

    public Mock<IContactRepository> ContactRepositoryFake()
    {
        var _allContacts = new List<Contact>();
        var mock = new Mock<IContactRepository>();
        mock.Setup(x=>x.AddContact(It.IsAny<Contact>()))
            .Callback((Contact c) =>
                {
                    _allContacts.Add(c);
                });
        mock.Setup(x => x.AllContacts).Returns(_allContacts);
        return mock;

    }
}

public interface IContactRepository
{
    void AddContact(Contact contact);
    IEnumerable<Contact> AllContacts { get; }
}

public class Contact
{
    public string Name { get; set; }
}

非常感谢您提前!欢迎任何其他建议: - )

ž

2 个答案:

答案 0 :(得分:3)

我个人认为你这样做的方式没有问题。我所看到的是你想要Mock而不是Stub你的存储库。这意味着您希望它在测试期间“记录”并返回数据。在这种情况下,Callback很有用,而且实际上是唯一的方法。

至于评论,如果你处理的是Stubbing而不是模拟,那么很少会使用Callback。文章imo有点笼统,并没有完全看到Callback的力量。

答案 1 :(得分:3)

您可以设置以下内容:

mock.Setup(x => x.AllContacts).Returns(GetExpectedContactList());

并有一个帮助函数,它返回一个联系人列表:

private static List<Contact> GetExpectedContactList() 
{
....
}

使用不同的Helper方法返回特定的数据场景。