2013-04-14 3 views
3

테스트 된 메소드가 특정 표현식과 함께 호출되었는지 확인하려고합니다. 내가 원하는 결과없이이 시간을 보냈다. MOQ를 사용하여 표현식 매개 변수 확인

이 종속성

public interface IEntityUtil 
{ 
    TEntity SelectSingle<TEntity>(Expression<Func<TEntity, bool>> predicate, System.Data.Objects.ObjectContext ctx) 
     where TEntity : EntityObject; 
    List<TEntity> SelectList<TEntity>(Expression<Func<TEntity, bool>> predicate, System.Data.Objects.ObjectContext ctx) 
     where TEntity : EntityObject; 
    bool Insert<TEntity>(TEntity entity, System.Data.Objects.ObjectContext ctx) 
     where TEntity : EntityObject; 
} 

입니다

public class sut 
{ 
    private IEntityUtil _ew; 
    public sut(IEntityUtil ew) 
    { 
     _ew = ew; 
    } 

    public void Search() 
    { 
     Guid id = Guid.Parse("CB594050-3845-4EAF-ABC5-34840063E94F"); 
     var res = _ew.SelectSingle<Post>(w => w.Id == id, new PersonalSiteEntities()); 
    } 

} 

테스트중인 시스템입니다 그리고 이것은 내가 그것을

public class tst 
{ 
    [TestMethod] 
    public void tst1() 
    { 
     var cwMock = new Mock<ConsoleApplication1.IEntityUtil>(); 

     Guid id = Guid.Parse("CB594050-3845-4EAF-ABC5-34840063E94F"); 

     //cwMock.Setup(x => x.SelectSingle<ConsoleApplication1.Post>(w => w.Id == id, It.IsAny<System.Data.Objects.ObjectContext>())).Returns(new ConsoleApplication1.Post()).Verifiable(); 


     //cwMock.Setup(x => x.SelectSingle(It.IsAny<Expression<Func<ConsoleApplication1.Post, bool>>>(), It.IsAny<System.Data.Objects.ObjectContext>())).Returns(new ConsoleApplication1.Post()).Verifiable(); 


     Expression<Func<ConsoleApplication1.Post, bool>> func = (param) => param.Id == id; 

     cwMock.Setup(x => x.SelectSingle<ConsoleApplication1.Post>(func, It.IsAny<System.Data.Objects.ObjectContext>())).Returns(new ConsoleApplication1.Post()); 

     var sut = new ConsoleApplication1.sut(cwMock.Object); 

     sut.Search(); 

     //cwMock.VerifyAll(); 

     cwMock.Verify(x => x.SelectSingle(func, It.IsAny<System.Data.Objects.ObjectContext>())); 
    } 


} 

주석 두 번째 유의하시기 바랍니다 테스트하려고하는 방법이다 설치 프로그램이 테스트를 통과하게 만들지 만 특정 표현식이 전달되었는지 확인할 수는 없습니다.

미리 감사드립니다. 크게 (우리가 당신을 도울 수) 도움이 될 것입니다

+0

그래서 결과는 무엇을 만들 : 이런 식으로 뭔가가 (통과하는 주석 설정을 사용)을 도와해야합니까? 문제가 어디에 있습니까? moq가 올바르게 수행되지 않습니까? – Mic

답변

1

두 가지

  • 세 가지 영역으로 테스트를 정렬하고, 별도의, 우리는 당신이 계신 알 수 있도록 의미있는 이름 테스트 부여

    1. 있습니다 의견이나 공백으로 :

      • 법,
      • 어설
      • 0 정렬

    이렇게하면 조치가 무엇인지 명확하게 알 수 있습니다.

    그런데 sut.Search()을 호출 할 때 ew.SelectSingle이 한 번 호출되었다고 주장하는 것으로 보입니다.

    또한 테스트에서 Guid를 만들고 있지만 아무 것도하지 않는 것으로 나타났습니다. 그래서, 여기에 (당신이 오류를 찾을 수 있도록 IDE를 사용하지 않는) 테스트에 빠른 제안입니다 :

    [Fact] 
        public void Verify_SelectSingle_IsCalledOnce(){ 
    
         Guid id = Guid.Parse("CB594050-3845-4EAF-ABC5-34840063E94F"); 
         var cwMock = new Mock<ConsoleApplication1.IEntityUtil>(); 
         var post = new ConsoleApplication1.Post{ Id = id }; 
         cwMock 
          .Setup(x=> x.SelectSingle<ConsoleApplication1.Post>(It.IsAny<Guid>)) 
          .Returns(post); 
         var sut = new ConsoleApplication1.sut(cwMock.Object); 
    
    
    
         sut.Search(); 
    
    
    
         cwMock.Verify( 
          x=> x.SelectSingle(It.IsAny<ObjectContect>(o => o.Id == id)), 
          Times.Once); 
        } 
    
  • 0

    으로 이미 언급은 당신이 달성하기 위해 노력하고 정확히 말해, 열심히 때문에 당신의 천국 ' 테스트 이름을 분명하게 만들었습니다. 즉, 표현을 확인할 수 있도록 조롱 한 설정에 콜백을 제공해야하는 것처럼 보입니다.

    cwMock.Setup(x => x.SelectSingle(It.IsAny<Expression<Func<ConsoleApplication1.Post, bool>>>(), It.IsAny<System.Data.Objects.ObjectContext>())).Callback<Expression<Func<ConsoleApplication1.Post, bool>>>(VerifyExpression).Returns(new ConsoleApplication1.Post()).Verifiable(); 
    

    그런 다음 콜백 메소드

    private static void VerifyExpression(Expression<Func<ConsoleApplication1.Post, bool>> expression) 
    { 
        var func = expression.Compile(); 
        // call func(params) and verify against it 
    } 
    
    관련 문제