[C#] Moq를 사용하여 메소드 호출 확인

저는 C #에서 단위 테스트를 처음 접했고 Moq를 사용하는 법을 배우고 있습니다. 아래는 내가 테스트하려고하는 수업입니다.

class MyClass
{
    SomeClass someClass;
    public MyClass(SomeClass someClass)
    {
        this.someClass = someClass;
    }

    public void MyMethod(string method)
    {
        method = "test"
        someClass.DoSomething(method);
    }
}

class Someclass
{
    public DoSomething(string method)
    {
        // do something...
    }
}

아래는 내 TestClass입니다.

class MyClassTest
{
    [TestMethod()]
    public void MyMethodTest()
    {
        string action="test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
        mockSomeClass.SetUp(a => a.DoSomething(action));
        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);
        mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
    }
}

다음과 같은 예외가 있습니다.

Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..

“MyMethod”메소드가 호출되고 있는지 확인하고 싶습니다. 뭔가 빠졌습니까?



답변

잘못된 방법을 확인 중입니다. Moq를 사용하려면 종속성 클래스에서 메소드를 설정 한 다음 선택적으로 확인해야합니다.

다음과 같은 작업을 수행해야합니다.

class MyClassTest
{
    [TestMethod]
    public void MyMethodTest()
    {
        string action = "test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();

        mockSomeClass.Setup(mock => mock.DoSomething());

        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);

        // Explicitly verify each expectation...
        mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once());

        // ...or verify everything.
        // mockSomeClass.VerifyAll();
    }
}

다시 말해, 당신은 MyClass#MyMethodcall을 확인하고 있으며 , SomeClass#DoSomething그 과정에서 클래스가 확실히 한 번 호출 합니다. Times인수는 필요하지 않습니다 . 나는 단지 그 가치를 보여주고 있었다.


답변