방금 Moq로 전환하여 문제가 발생했습니다. 나는 비즈니스 객체의 새로운 인스턴스를 만들고, 사용자 입력 값으로부터 객체의 속성을 설정하고, 새로운 객체를 저장하기위한 메소드 (SaveCustomerContact)를 호출하는 메소드를 테스트하고있다. Business Object는 리모트 계층을 거치기 때.에 인수로 전달됩니다. SaveCustomerContact에 전달되는 객체가 예상대로 설정되는 모든 속성을 가지고 있는지 테스트해야합니다. 그러나 컨트롤러 메소드에서 새로운 것으로 인스턴스화되었으므로 그렇게 할 수 없습니다.Moq로 참조 매개 변수 값 확인
[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();
}
이 그 매개 변수의 연락을 취하는 얻기 위해 많은 시도의 단지 가장 최근의 :
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);
}
여기 테스트입니다. 참고로 실제의 값은 초기 (구성된) 상태에서 변경되지 않습니다.
대상 호출이 실패한 후 Assert.AreEqual (expected, actual) 이동. .CallBack 대신 .Verifiable()을 추가 한 다음 대상 뒤에 remote.Verify를 호출하면 (또는 모의을 엄격하게 설정) 테스트에서 제공하는 매개 변수가 항상 실패하기 때문에 항상 실패합니다. 컨트롤러 메소드에서 작성된 인스턴스와 동일한 인스턴스.
저는 Moq 3.0.308.2를 사용하고 있습니다. 이것을 테스트하는 방법에 대한 아이디어는 인정 될 것입니다. 감사!
나는이 글을 어떻게 스텁 시킬지 모르겠다. (스텁에 대해서는 잘 모르지만). 어떻게 처리 할 수 있는지 자세히 설명해 주시겠습니까? –
또한 ref 참조에 관해서는 동의하는 바가 있지만, 이는 리모팅 계층이 작동하는 방식이며, 테스트를 더 쉽게 작성할 수 있도록 백엔드의 임의 비트를 래핑하는 선례를 시작하는 것을 싫어합니다. –
비슷한 문제가 있었는데 MoQ 작업을 할 때 너무 제로가되었습니다. 내 스텁을 쓸 수 있다는 것을 잊었습니다! 고맙습니다. –