Programing

moq를 사용하여 일부 메서드 만 모의

lottogame 2020. 12. 3. 07:23
반응형

moq를 사용하여 일부 메서드 만 모의


다음과 같은 방법이 있습니다.

public CustomObect MyMethod()
{
    var lUser = GetCurrentUser();
    if (lUser.HaveAccess)
    {
        //One behavior
    }
    else 
    {
        //Other behavior
    }

    //return CustomObject
}

IMyInterface.GetCurrentUser호출하는 동안 MyMethod코드 경로 중 하나에 도달하여 확인할 수 있도록 mock하고 싶습니다 . Moq로 어떻게할까요?

나는 다음 일을하고있다 :

var moq = new Mock<IMyInterface>();            
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);

//act
var lResult = moq.Object.MyMethod();

그러나 어떤 이유로 lResult항상 null내가으로 얻으려고 할 때 MyMethod디버그 항상 다음 문으로 건너 뛰는거야.


이것을 부분 모의 (partial mock)라고하며 moq에서 수행하는 방법은 인터페이스가 아닌 클래스를 모의 한 다음 모의 객체의 "Callbase"속성을 "true"로 설정해야합니다.

이를 위해서는 테스트중인 클래스의 모든 메서드와 속성을 가상으로 만들어야합니다. 이것이 문제가 아니라고 가정하면 다음과 같은 테스트를 작성할 수 있습니다.

 var mock = new Mock<YourTestClass>();
 mock.CallBase = true;
 mock.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);
 mockedTest.Object.MyMethod();

Lee의 대답을 확장하면 ,

클래스의 모든 메서드와 속성을 가상으로 만들 필요는 없으며 모의하려는 것만 가능합니다.

또한 클래스의 구체적인 구현을 조롱해야합니다.

var mock = new Mock<YourTestClass>(); // vs. var mock = new Mock<IYourTestInterface>();

클래스에 기본 생성자가없는 경우 다음을 통해 전달할 인수도 지정해야합니다.

var mock = new Mock<YourTestClass>(x, y, z);
// or
var mock = new Mock<YourTestClass>(MockBehavior.Default, x, y, z);

x, y, z생성자에 대한 첫 번째, 두 번째 및 세 번째 매개 변수는 각각 어디에 있습니까 ?

마지막으로, 모의하려는 방법이 보호되는 경우 다음을 포함해야합니다. Moq.Protected

using Moq.Protected;

TReturnType returnValue = default(TReturnType);

mock.Protected()
    .Setup<TReturnType>("YourMockMethodName", It.IsAny<int>()) // methodname followed by arguments
    .Returns(returnValue);

비슷한 경우가있었습니다. 다음 코드는 인터페이스의 특정 구현에서 모의 ​​메서드와 실제 메서드를 모두 사용할 수있는 유연성을 제공했습니다.

var mock = new Mock<ITestClass>(); // Create Mock of interface

// Create instance of ITestClass implementation you want to use
var inst = new ActualTestClass();

// Setup to call method of an actual instance
// if method returns void use mock.Setup(...).Callback(...)
mock.Setup(m => m.SomeMethod(It.IsAny<int>())
    .Returns((int x) => inst.SomeMethod(x));

이제 실제 메서드를 사용할 수 있지만 Verify호출 된 횟수를 확인하는 것과 같은 것도 사용할 수 있습니다 .

참고URL : https://stackoverflow.com/questions/4769928/using-moq-to-mock-only-some-methods

반응형