2011-03-09 7 views
12

인 메서드 호출을 확인합니다. "params"목록이있는 메서드가 호출되었지만 어떤 이유로이 함수가 실패했는지 Moq를 테스트하려고합니다. 방법 서명이 같은 것입니다 :Moq - 매개 변수 값이

void AttachAsModifiedToOrders(IOrder order, params 
     Expression<Func<IOrder, object>>[] modifiedProperties); 

그런 다음 모의 설정에서 나는 이런 식으로 뭔가가 할 짓을했는지 간단한 조롱 컬렉션 "/ 삽입물을 분리"

마지막으로
MockEntities.Setup(n => n.AttachAsModifiedToOrders(It.IsAny<DataAccess.Order>())) 
    .Callback<IOrder, Expression<Func<IOrder, object>>[]>((order, expr) => 
     { Orders.Remove(Orders.Where(o => o.Id== order.Id).First()); 
     Orders.Add((DataAccess.Order)order); }); 

, 검증은 :

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), 
    It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1)); 

나는 확인했습니다, 그리고 코드는 확인을 실행하고 방법합니다 (하나를 조롱)라고하지만, 검증이 실패합니다. 내가 놓친 게 있니? 또는이 "params"호출이 Moq에서 지원되지 않는다는 것입니까?

+0

Moq의 버전은 무엇입니까? –

+0

어셈블리가 4.0.0이라고 말합니다 –

+0

아, 알았습니다. 나는 3과 3.1에 대한 오래된 버그 게시물을 보았다. –

답변

12

이 복제가 어려웠습니다. 나는 오타에 있다고 생각하여 확인합니다

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1)); 

가되어야한다

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object[]>>>()), Times.Exactly(1)); 

내가 처음 It.IsAny 인터페이스가 아닌 구체적인 유형해야하는 경우도 궁금해?

그러나 이것은 약간의 기능에 대한 지나치게 복잡한 테스트이며 코드 샘플에는 DataAccess 유형 또는 클래스 인스턴스 (확실하지 않습니까?), 주문 및 주문과 같은 몇 가지 요소가 누락되어 있습니다.

그 해결하려면

, 나는 IOrder 인터페이스와 인터페이스는 조금 무의미한를 사용하는 조작 객체를 생성하지만, 테스트 드라이브 : 나는 다음을 검증하기위한 테스트 픽스처를 생성
public interface IOrder 
{ 
    void AttachAsModifiedToOrders(IOrder order, params Expression<Func<IOrder, object[]>>[] modifiedProperties); 

} 

public class Manipulator 
{ 
    public Manipulator(IOrder order) 
    { 
     Expression<Func<IOrder, object[]>> exp = o => new object[0]; 
     order.AttachAsModifiedToOrders(order, exp); 
    } 

    public void DoStuff() { } 
} 

params arg :

[TestFixture] 
public class Tester 
{ 
    [Test] 
    public void Test() 
    { 
     var order = new Mock<IOrder>(); 
     order.Setup(n => n.AttachAsModifiedToOrders(It.IsAny<IOrder>())); 

     var manipulator = new Manipulator(order.Object); 
     manipulator.DoStuff(); 

     order.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<IOrder>(), It.IsAny<Expression<Func<IOrder, object[]>>>()), Times.Once()); 
    } 
} 

이것은 나를 위해 작동하므로 문제가 params 값과 Moq에 직접적이라고 생각하지 않습니다. Mock과 상호 작용하는 클래스를 실제로 테스트하는지, 아니면 몇 가지 다른 유형의 통합 된 사용법을 검증하려고하는지 확인하는 것이 좋습니다. params와 expression tree는 약간의 냄새도 가지고 있습니다.

+0

은 배열 param을 사용하여 확인 작업을 호출하지 않았 음을 알았지 만이 테스트를 수행하는 데 시간을 할애 해 주셔서 감사합니다. 이 모든 것을 지정해야하는 것은 약간 번거롭지만 잘 ... –

+1

테스트하기가 어렵다면 표현하기 어렵고 이해하기 어렵다고 생각합니다. 모양을 고려할만한 가치가 있습니다. –

관련 문제