我从IoC/模拟开始,并希望确保我的存储库使用的是“最佳实践”。

我正在为我的存储库设置接口(interface)。具体的实现将指向SQL,而测试将使用Moq生成“伪造品”。我注意到我经常使用Moq的回调功能。在this文章中,作者指出。



我看过了,看不到实现我需要的任何其他方法-即“假”存储库。有人可以告诉我这里是否缺少什么吗?没有回调,有没有办法实现这一目标?

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

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

ž

最佳答案

我个人认为您执行此操作的方式没有问题。我看到的是您要模拟而不是对存储库进行 stub 。这意味着您希望它在测试过程中“记录”并返回数据。在这种情况下,Callback是有用的,并且实际上是实现此目的的唯一方法。

至于注释,如果您要处理的不仅仅是 stub ,那么Callback将很少使用。文章imo有点笼统,还没有完全了解Callback的功能。

关于moq - 模拟存储库模式的最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6274991/

10-11 22:43
查看更多