c# setup - 使用Moq來確定是否調用方法




github moq4 (3)

我的理解是,如果我調用更高級別的方法,我可以測試是否會發生方法調用,即:

public abstract class SomeClass()
{    
    public void SomeMehod()
    {
        SomeOtherMethod();
    }

    internal abstract void SomeOtherMethod();
}

我想測試一下,如果我調用SomeMethod()那麼我期望SomeOtherMethod()會被調用。

我是否認為這種測試在模擬框架中可用?


Answers

你可以看到一個你嘲笑的東西的方法是否已經通過Verify來調用,例如:

static void Main(string[] args)
{
        Mock<ITest> mock = new Mock<ITest>();

        ClassBeingTested testedClass = new ClassBeingTested();
        testedClass.WorkMethod(mock.Object);

        mock.Verify(m => m.MethodToCheckIfCalled());
}

class ClassBeingTested
{
    public void WorkMethod(ITest test)
    {
        //test.MethodToCheckIfCalled();
    }
}

public interface ITest
{
    void MethodToCheckIfCalled();
}

如果該行被留下評論,則在調用Verify時將引發MockException。 如果未註釋它會通過。


不,模擬測試假設你正在使用某些可測試的設計模式,其中之一是注入。 在你的情況下,你將測試SomeClass.SomeMethodSomeOtherMethod必須在需要接口的另一個實體中實現。

你的Someclass構造函數看起來像New(ISomeOtherClass) 。 然後,你會嘲笑ISomeOtherClass並設置SomeOtherMethod的期望被調用並驗證期望值。


默認情況下繼續使用私人。 如果一個成員不應該暴露在這種類型之外,那麼它就不應該暴露在這種類型之外,即使是在同一個項目中。 這使得事情變得更加安全和整潔 - 當你使用這個對象的時候,更清楚你可以使用哪些方法。

話雖如此,我認為有時為了測試目的而自然而私有的方法是內部合理的。 我更喜歡使用反射,這是重構不友好的。

有一件事要考慮可能是一個“ForTest”後綴:

internal void DoThisForTest(string name)
{
    DoThis(name);
}

private void DoThis(string name)
{
    // Real implementation
}

那麼當你在同一個項目中使用這個類時,很明顯(現在和將來)你不應該真正使用這種方法 - 它只是出於測試目的。 這有點冒險,而不是我自己做的事情,但至少值得考慮。





c# .net unit-testing mocking moq