2013-03-04 11 views
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을 확인했지만 비어 있습니다.

답변

1

productsServiceProductsImportProcess에 모의이 삽입되지 않아 실제 IProductsWebService에서 이루어진 통화를 가로 챌 수 없습니다. 코드에서 IProductsWebService 개체를 어떻게 인스턴스화합니까?

+0

실제로 위 코드에서 생성자에 의해 주입됩니다 :'target = new ProductsImportProcess (..., productsService.Object, ...);'응용 프로그램에서 IoC 컨테이너 (Ninject)에 의해 주입 됨 – Marek

+0

위의 코드에 따르면, 주입 한 후에 인스턴스화하므로 테스트에 주입하면 null이 될 것입니다. – levelnis

+0

예, 요점이 있습니다 -받은 후에 코드를 여러 번 변경했습니다. 'getClassLevelLang'에서 커스텀 동등 로직을 구현하기 전에) 그런 오류가 처음 나는 것을 놓쳤습니다. 신기한 실수 ... Thx 많이! – Marek