2012-01-04 4 views
3

나는 Machine.Fakes로 막 다른 골목에 섰다. 나는 매개 변수를 만을 모의하는 방법을 알아낼 수 없다. Machine.Fakes 장비. RhinoMocks에 a bug이 있었기 때문에, 저는 Make 어댑터를 FakeItEasy로 전환했습니다. 내가 알 수있는 한, 모든 어댑터는 상호 교환이 가능해야합니다.어떻게 mock 프레임 워크와 독립적으로 Machine.Fakes와 'out'매개 변수를 조롱합니까?

Arg은 Rhino.Mocks이기 때문에 문제가 발생하여 "out"테스트가 실패하고 더 이상 컴파일되지 않는 것입니다.

The<IMembershipService>() 
    .WhenToldTo(x => x.CreateUser(Param<string>.IsAnything, 
     Param<bool>.IsAnything, 
     Param<object>.IsAnything, 
     out Arg<MembershipCreateStatus> 
      .Out(MembershipCreateStatus.UserRejected) 
      .Dummy)) 
    .Return(user); 

나는 원래 Arg<T> PARAM가로 설정 동일한 값으로 설정 "더미"지역 변수를 사용하여 시도,하지만이 실패 할 내 테스트가 발생했습니다 - 값이되지 않는 것처럼 보인다 지나가 다! Arg<T>에는 정말 해결책이 있었지만 Rhino의 일부인 것처럼 더 이상 사용할 수 없습니다. 모의.

답변

2

버전 1.7.0 Machine.Fakes 이후 out 가짜 통화에서 ref 매개 변수를 설정 지원 -시 FakeItEasy 또는 NSubstitute 어댑터를 사용하십시오. 따라서 FakeItEasy를 직접 사용할 필요가 없습니다. Alex의 예는 다음과 같이 단순화 할 수 있습니다.

using Machine.Fakes; 
using Machine.Specifications; 

namespace MSpecMFakesOutParam 
{ 
    public interface IFoo 
    { 
     void Foo(out int foo); 
    } 

    public class When_using_FakeItEasy_with_out_params : WithFakes 
    { 
     static int Out; 

     Establish context =() => 
     { 
      int ignored; 
      The<IFoo>().WhenToldTo(x => x.Foo(out ignored)).AssignOutAndRefParameters(42); 
     }; 

     Because of =() => The<IFoo>().Foo(out Out); 

     It should_assign_the_out_param =() => Out.ShouldEqual(42); 
    } 
} 
+0

+1이것은 void 메소드에서만 작동하는 것처럼 보입니다. 많은 경우에'out' 매개 변수가 추가 반환 값을 반환하는 데 사용되기 때문에 약간 제한적으로 보입니다. – MattDavey

+0

예, @MattDavey, void 메소드에만 구현했습니다. 제한적이라고 생각하지만 쿼리를 구현하면 API가 복잡해집니다. –

+0

또한 잘못된 매개 변수로 간주되기 때문에 out 매개 변수 지원은 원래 구현되지 않았습니다. NET Framework에서도 매개 변수를 사용하기 때문에 가치가있는 옵션이라고 생각합니다. 하지만 한 가지 방법으로 반환 값과 출력 매개 변수가 좋은 디자인이라고 말할만큼 멀리 가지 않을 것입니다. 튜플을 반환하거나 여러 개의 매개 변수가 있다고 말하고 싶습니다. 그래서 저는 MFakes를 이런 방식으로 계속 주장했습니다. –

5

이 경우 FakeItEasy를 직접 사용해야합니다. 나는 FakeItEasy가 가짜 객체 호출 명세에 AssignsOutAndRefParameters을 붙임으로써 out 매개 변수를 어떻게 설정해야하는지에 문제가 있다고 생각한다. Machine.Fakes가 수행하는 모든 것은 WhenToldTo 등을 사용 된 faking 프레임 워크의 적절한 API로 변환하기 때문에 문제는되지 않습니다.

using FakeItEasy; 

using Machine.Fakes; 
using Machine.Specifications; 

namespace MSpecMFakesOutParam 
{ 
    public interface IFoo 
    { 
    void Foo(out int foo); 
    } 

    public class When_using_FakeItEasy_with_out_params : WithFakes 
    { 
    static IFoo Foo; 
    static int Out; 

    Establish context =() => 
    { 
     Foo = An<IFoo>(); 

     var ignored = A<int>.Ignored; 
     A.CallTo(() => Foo.Foo(out ignored)).AssignsOutAndRefParameters(42); 
    }; 

    Because of =() => Foo.Foo(out Out); 

    It should_assign_the_out_param = 
    () => Out.ShouldEqual(42); 
    } 
} 
8

Machine.Fakes는이 시나리오를 처리하지 않습니다. 그것은 단순히 구현되지 않았습니다.

저는 개인적으로 매개 변수를 사용하지 않으며 (실제로 여러 개의 반환 값을 반환해야하는 경우) 튜플 (터플 < T, K >) 또는 이러한 시나리오에 대한 사용자 정의 클래스를 사용합니다. 그래서 내 최우선 순위는 절대로 높지 않았습니다.

나는 그것을 조사하지 않았지만, Machine.Fakes에서 ref 및 out 매개 변수를 처리하는 것이 실현 가능하지 않을 수도 있습니다. 여러 조롱 프레임 워크 위에 래퍼를 구현할 때 발생하는 문제 중 하나는 성공하려면 모든 조롱 프레임 워크가 작동하는 방식에 공통 분모가 있어야한다는 것입니다. Machine.Fakes는 또한 모든 항목에 대한 공통 분모를 찾을 수 없어서 조롱 이벤트를 지원하지 않습니다 (NS substitute/FakeItEasy와 Rhino/Moq의 두 가지 경우에만 해당). 당신은 우리가 얘기하고있는 인터페이스를 제어하는 ​​경우

  1. , 당신은 튜플 또는 사용자 정의 클래스를 통해 문제를 우회 할 수있다 : 제가보기에는

    당신은 현재 두 가지 옵션이 있어요.

  2. 인터페이스를 소유하고 있지 않다면 알렉산더 그로스 (Alexander Gross)가 제안한 것과 같은 상황에서 항상 기본 모의 프레임 워크로 돌아갈 수 있습니다.

죄송합니다 당신에게 더 나은 답변을 ;-)

  • 비욘를 제공하지 않는
관련 문제