2014-06-07 2 views
1

moq를 사용하여 내 라이센스 클래스에서 함수를 모의하려고합니다. 내가 게으른 부하 객체에 MEF를 사용하고 내 통합 테스트에서moq에 술어 함수 매개 변수를 전달하지 못했습니다.

Licence TryGetLicence(Predicate<Licence> filter); 

:

라이센스 클래스는 다음과 같은 인터페이스를 가지고 있습니다. 내 클래스는로드 된 객체를 찾고 사용할 수있는 라이센스가 있는지 확인해야합니다. 내 테스트를 위해 두 개의 객체를 만들고 그 중 하나는 라이센스가 부여됩니다. 나는 moq을 사용하여이 객체에 대한 라이선스 만 반환하고 다른 클래스에 대해서는 null을 반환하려고합니다. 실제 클래스처럼. 문제는 moq이 술어를 전달하는 것을 좋아하지 않는다는 것입니다. moq가 이런 식으로 술어를 처리하지 못하거나 그냥 잘못 구현 한 것인지 잘 모르겠습니다. 여기

위의 인터페이스를 위해 MOQ을 설정 내 테스트에서 내가 가진 코드의 라인은 다음과 같습니다

var lic = new Licence 
{ 
    LicId = Guid.Parse("53024D4E-3A01-4489-A341-753D04748EB9"), 
    LicName = "test", 
    Count = 1, 
    ExpiryDate = DateTime.Now.AddDays(2) 
}; 

var mockAgent = new Mock<ILicenceAgent>(); 
mockAgent.Setup(x => x.TryGetLicence (y => y.LicId == lic.LicId)) Returns(lic); 

이 빌드하지만 마지막 줄 명중 될 때 지원되지 않는 표현 예외가 발생합니다.

는 다른 테스트를 위해 내가 사용하고 있습니다 : 그것은 내가 넣은 두 개체에 대한 유효한 라이센스를 반환 나는 나의 새로운 시험이 사용할 수 없습니다

mockAgent.Setup(x => x. TryGetLicence (It.IsAny<Predicate<Licence>>())).Returns(lic); 

.

moq를 사용하는 방식으로 사용할 수 있습니까?

답변

2

:

Predicate<Licence> predicate = y => y.LicId == lic.LicId; 
mockAgent.Setup(x => x.TryGetLicence (predicate)).Returns(lic); 

당신이 Setup 전화 내부의 술어를 작성, 람다 표현식은 매개 변수로 전달 될 표현식의 일부로 평가됩니다. 우리는 위 라인의 델리게이트 만 확인함으로써이를 방지합니다.

+0

감사합니다. 이것은 내가해야 할 일을합니다. 시간을 많이 절약 해 줬어. – Retrocoder

0

당신이이 라이센스가있는 경우 -, lic1 및 lic2을 당신이 할 수있는이 같은 설정 모의 :이 문제를 해결해야

mockAgent.Setup(x => x.TryGetLicence(It.Is<Predicate<Licence>>(/* add your specific condition for licence1 */))).Returns(lic1); 
mockAgent.Setup(x => x.TryGetLicence(It.Is<Predicate<Licence>>(/* add your specific condition for licence2 */))).Returns(lic2); 
관련 문제