1
비슷한 문제가있는 경우 또는 here을 요청했지만 해결책이 제 경우에는 적용되지 않는 것처럼 보입니다. (calls
리스트 만 디버깅이다)Moq 설정에 따른 참조 유형 매개 변수 일치
public interface IProductsWebService
{
ICObjectLang[] GetClassLevel(getClassLevelLang criteria);
}
// the rest of this class was automaticaly generated as web service reference
public partial class getClassLevelLang : IEquatable<getClassLevelLang>
{
public override bool Equals(object obj)
{
var other = obj as getClassLevelLang;
return Equals(other);
}
public bool Equals(getClassLevelLang other)
{
if (this == other)
{
return true;
}
if (other == null)
{
return false;
}
return CID == other.CID &&
accessCode == other.accessCode &&
classCode == other.classCode &&
depth == other.depth &&
language == other.language &&
partyCode == other.partyCode &&
refId == other.refId;
}
public override int GetHashCode()
{
var hash = 531;
hash += CID != null ? CID.GetHashCode() : 1;
hash += accessCode != null ? accessCode.GetHashCode() : 1;
hash += classCode != null ? classCode.GetHashCode() : 1;
hash += depth != null ? depth.GetHashCode() : 1;
hash += language != null ? language.GetHashCode() : 1;
hash += partyCode != null ? partyCode.GetHashCode() : 1;
hash += refId != null ? refId.GetHashCode() : 1;
return hash;
}
public override string ToString()
{
var str = new StringBuilder();
str.AppendFormat("CID: {0}, ", CID);
str.AppendFormat("accessCode: {0}, ", accessCode);
str.AppendFormat("classCode: {0}, ", classCode);
str.AppendFormat("depth: {0}, ", depth);
str.AppendFormat("language: {0}, ", language);
str.AppendFormat("partyCode: {0}, ", partyCode);
str.AppendFormat("refId: {0}", refId);
return str.ToString();
}
}
그리고 테스트 용 다음 코드 :
는 다음의 클래스들을 고려
private Mock<IProductsWebService> productsService;
private IProductsImportProcess target;
private List<getClassLevelLang> calls = new List<getClassLevelLang>();
[TestMethod]
public void RecursiveDownloadTest()
{
//other mocks (configuration, log, categoryService and configurationService) set here
target = new ProductsImportProcess(
configuration.Object, log.Object, categoryService.Object,
productsService.Object, configurationService.Object);
productsService = new Mock<IProductsWebService>(MockBehavior.Strict);
var root1 = new Category
{
CategoryID = "root1",
SubCategories = new List<Category>
{
new Category
{
CategoryID = "cat1.1",
SubCategories = new List<Category>
{
new Category
{CategoryID = "cat1.1.1"}
}
},
new Category
{
CategoryID = "cat1.2"
}
}
};
var root2 = new Category { CategoryID = "root2" };
setupProductsServiceCall("tree1", root1, true);
setupProductsServiceCall("tree1", root1.SubCategories.First().SubCategories.First());
setupProductsServiceCall("tree2", root2, true);
target.Execute();
productsService.VerifyAll();
}
private void setupProductsServiceCall(string treeCode, Category category, bool isRoot = false)
{
var config = configuration.Object;
var criteria = new getClassLevelLang
{
CID = isRoot ? null : category.CategoryID,
language = "all",
partyCode = "something",
depth = "1",
classCode = treeCode,
accessCode = "xyz"
};
var productsNode = TestUtils.CreateAbbProductsNode(category);
productsService.Setup(mock => mock.GetClassLevel(It.Is<getClassLevelLang>(c => c.Equals(criteria)))).
Callback<getClassLevelLang>(c => calls.Add(c)). //added for debuging purposes only
Returns(productsNode.objectAttributes).
Verifiable();
}
시험 위에서 다음 예외 실패
:
Test method ProductsImport.Console.Test.ProductsImportProcessUnitTest.RecursiveDownloadTest threw exception:
Moq.MockVerificationException: The following setups were not matched:
IProductsWebService mock => mock.GetClassLevel(It.Is<getClassLevelLang>(c => c.Equals(CID: , accessCode: xyz, classCode: tree1, depth: 1, language: all, partyCode: something, refId:)))
IProductsWebService mock => mock.GetClassLevel(It.Is<getClassLevelLang>(c => c.Equals(CID: cat1.1.1, accessCode: xyz, classCode: tree1, depth: 1, language: all, partyCode: something, refId:)))
IProductsWebService mock => mock.GetClassLevel(It.Is<getClassLevelLang>(c => c.Equals(CID: , accessCode: xyz, classCode: tree2, depth: 1, language: all, partyCode: something, refId:)))
Result StackTrace:
at Moq.Mock.VerifyAll()
나는 ProductsWebService.GetClassLevel이 bei getClassLevelLang.Equals
이 (디버거를 사용하여 확인하지 않은) 호출되었습니다. 더 이상한 것은 무엇입니까 VerifyAll()
list를 호출하기 직전에 실제 값 calls
을 확인했지만 비어 있습니다.
실제로 위 코드에서 생성자에 의해 주입됩니다 :'target = new ProductsImportProcess (..., productsService.Object, ...);'응용 프로그램에서 IoC 컨테이너 (Ninject)에 의해 주입 됨 – Marek
위의 코드에 따르면, 주입 한 후에 인스턴스화하므로 테스트에 주입하면 null이 될 것입니다. – levelnis
예, 요점이 있습니다 -받은 후에 코드를 여러 번 변경했습니다. 'getClassLevelLang'에서 커스텀 동등 로직을 구현하기 전에) 그런 오류가 처음 나는 것을 놓쳤습니다. 신기한 실수 ... Thx 많이! – Marek