developer tip

Moq Callback () 호출에서 변수 값 설정

copycodes 2020. 12. 8. 08:24
반응형

Moq Callback () 호출에서 변수 값 설정


Moq 콜백 메서드의 구문에 대해 약간 혼란 스러울 수 있다고 생각합니다. 다음과 같이 시도 할 때 :

IFilter filter = new Filter();
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() };  

IQueryable myFilteredFoos = null;
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
   .Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects))
   .Returns(myFilteredFoos.Cast<IFooBar>());

호출 myFilteredFoos중에 null 이므로 예외 가 발생합니다 Cast<IFooBar>(). 예상대로 작동하지 않습니까? 나는 FilterCollection호출 될 것이라고 생각 하고 myFilteredFoosnull이 아니고 캐스트를 허용합니다.

FilterCollection호출되지 않는 결론에 나를 이끄는 null을 반환 할 수 없습니다. 또한 myFilteredFoos다음과 같이 선언 할 때 :

Queryable myFilteredFoos;

Return 호출은 myFilteredFoos가 초기화되기 전에 사용될 수 있다고 불평합니다.


이는 Returns메서드 의 코드 가 즉시 평가 되기 때문입니다 . 즉, Setup메서드가 호출 될 때입니다.

그러나 콜백은 GetByFilter메서드가 호출 될 때까지 호출되지 않습니다 .

운 좋게도 Returns메서드는 오버로드되어 실행을 연기 할 수도 있습니다.

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
    .Callback((IFilter filter) =>
        myFilteredFoos = filter.FilterCollection(objects))
    .Returns(() => myFilteredFoos.Cast<IFooBar>());

그러나 Returns메서드 에서 직접 매개 변수 값을 가져올 수 있으므로 콜백에 값을 저장할 필요가 없습니다 .

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
    .Returns((IFilter filter) =>
        filter.FilterCollection(objects).Cast<IFooBar>());

반환 값에서 매개 변수를 사용할 수 있습니다.

mockObject
  .Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
  .Returns((IFilter filter) =>
    {
      myFilteredFoos = filter.FilterCollection(objects);

      return myFilteredFoos.Cast<IFooBar>();
    });

참고 URL : https://stackoverflow.com/questions/2494930/settings-variable-values-in-a-moq-callback-call

반응형