Я начинаю с 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