Я просто перешел на Moq и столкнулся с проблемой. Я тестирую метод, который создает новый экземпляр бизнес-объекта, устанавливает свойства объекта из пользовательских значений ввода и вызывает метод (SaveCustomerContact) для сохранения нового объекта. Бизнес-объект передается как аргумент ref, поскольку он проходит через удаленный слой. Мне нужно проверить, что объект, передаваемый в SaveCustomerContact, имеет все свои свойства, установленные как ожидалось, но поскольку он создан как новый в методе контроллера, я не могу этого сделать.Проверьте значение параметра ссылки с Moq
public void AddContact() {
var contact = new CustomerContact() { CustomerId = m_model.CustomerId };
contact.Name = m_model.CustomerContactName;
contact.PhoneNumber = m_model.PhoneNumber;
contact.FaxNumber = m_model.FaxNumber;
contact.Email = m_model.Email;
contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
contact.EmailFlag = m_model.EmailFlag;
contact.FaxFlag = m_model.FaxFlag;
contact.PostalMailFlag = m_model.PostalMailFlag;
contact.CustomerLocationId = m_model.CustomerLocationId;
RemotingHandler.SaveCustomerContact(ref contact);
}
Вот тест:
[TestMethod()]
public void AddContactTest() {
int customerId = 0;
string name = "a";
var actual = new CustomerContact();
var expected = new CustomerContact() {
CustomerId = customerId,
Name = name
};
model.Setup(m => m.CustomerId).Returns(customerId);
model.SetupProperty(m => model.CustomerContactName, name);
model.SetupProperty(m => m.PhoneNumber, string.Empty);
model.SetupProperty(m => m.FaxNumber, string.Empty);
model.SetupProperty(m => m.Email, string.Empty);
model.SetupProperty(m => m.ReceiveInvoiceFlag, false);
model.SetupProperty(m => m.ReceiveStatementFlag, false);
model.SetupProperty(m => m.ReceiveContractFlag, false);
model.SetupProperty(m => m.EmailFlag, false);
model.SetupProperty(m => m.FaxFlag, false);
model.SetupProperty(m => m.PostalMailFlag, false);
model.SetupProperty(m => m.CustomerLocationId, 0);
remote
.Setup(r => r.SaveCustomerContact(ref actual))
.Callback(() => Assert.AreEqual(actual, expected));
target.AddContact();
}
Это только самая последняя из многих попыток получить Ахольд этого параметра. Для справки значение фактического не изменяется от его начального (построенного) состояния.
Перемещение Assert.AreEqual (ожидается, актуально) после сбоя целевого вызова. Если я добавлю .Verifiable() к настройке, а не к .CallBack, а затем вызовет remote.Verify после цели (или, я полагаю, установить макет в строгу), он всегда терпит неудачу, потому что параметр, который я предоставляю в тесте, не является тот же экземпляр, что и тот, который создан в методе контроллера.
Я использую Moq 3.0.308.2. Любые идеи о том, как протестировать это, будут оценены. Благодаря!
Наверное, я не уверен, как бы вы это заглушили (хотя я мало что знаю о заглушках). Можете ли вы рассказать о том, как это можно было бы решить? –
Кроме того, насколько я согласен с вами в вопросе ref, так работает наш удаленный уровень, и я бы не хотел создавать прецедент для обертывания случайных бит бэкэнд, чтобы я мог легче писать тесты. –
У меня была подобная проблема, и я настолько обнулен, что работал над MoQ, я забыл, что могу написать свою собственную заглушку! Спасибо. –