簡體   English   中英

使用 Moq 測試抽象類

[英]Using Moq To Test An Abstract Class

我正在嘗試對抽象類中的方法運行單元測試。 我已經壓縮了下面的代碼:

抽象類:

public abstract class TestAb
{
    public void Print()
    {
        Console.WriteLine("method has been called");
    }
}

測試:

[Test]
void Test()
{
    var mock = new Mock<TestAb>();
    mock.CallBase = true;
    var ta = mock.Object;
    ta.Print();
    mock.Verify(m => m.Print());
}

信息:

Method is not public

我在這里做錯了什么? 我的目標是使用 Moq 框架測試抽象類中的方法。

該消息是因為您的Test()方法不是public 測試方法需要public 即使在public測試方法之后它也會失敗,因為您只能驗證abstract / virtual方法。 因此,在您的情況下,您必須將方法設為virtual因為您已經實現了。

如果您想在這樣的抽象類上模擬方法,那么您需要使其成為虛擬的或抽象的。

回答了類似的問題:

作為一種解決方法,您可以不使用方法本身,而是創建虛擬包裝器方法

public abstract class TestAb
{
    protected virtual void PrintReal(){
            Console.WriteLine("method has been called");
    }

    public void Print()
    {
        PrintReal();
    }
}

然后在測試類中覆蓋它:

abstract class TestAbDelegate: TestAb{

     public abstract override  bool PrintReal();
}

測試:

[Test]
void Test()
{
    var mock = new Mock<TestAbDelegate>();
    mock.CallBase = true;

   mock.Setup(db => db.PrintReal());

    var ta = mock.Object;
    ta.Print();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM