Лучшая практика для насмешливого шаблона репозитория - PullRequest
10 голосов
/ 08 июня 2011

Я начинаю с IoC / Mocking и хочу убедиться, что я использую «лучшие практики» для своих репозиториев.

Я настраиваю интерфейсы для своих репозиториев.Конкретные реализации будут указывать на SQL, в то время как тестирование будет использовать Moq для генерации «подделок».Я заметил, что я использую функцию обратного вызова Moq lot этой статье автор заявляет.

, поскольку 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; }
}

Большое спасибо заранее!Любые другие советы приветствуются: -)

Z

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Вы можете просто настроить следующее:

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

и имеет вспомогательную функцию, которая возвращает список контактов:

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

И имеют разные методы Helper для возврата определенных сценариев данных.

3 голосов
/ 08 июня 2011

Лично я не вижу проблемы с тем, как вы это делаете. Я вижу, что вы хотите издеваться, а не заглушки вы хранилище. Это означает, что вы хотите, чтобы он «записывал» и возвращал данные обратно во время теста. В этом случае Callback является полезным и действительно единственным способом сделать это.

Что касается комментария, если вы имеете дело с Stubbing больше, чем с насмешками, то Callback будет использоваться редко. статья imo немного общая и не в полной мере видит силу Callback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...