簡體   English   中英

如何使用moq斷言在C#中調用的函數?

[英]How do I use moq to assert a function is called in c#?

我正在嘗試學習如何使用Moq用C#進行單元測試。 我設置了一個簡單的類BasicMath,它具有一個函數int Multiply(int a, int b) ,主體僅返回a * b。 我還有另一個叫做AdvancedMath的類,它具有一個函數'int Square(int a)',主體調用Multiply(a,a)並返回結果。

我正在嘗試為AdvancedMath.Square編寫一個簡單的測試,該測試將斷言使用正確的值調用BasicMath.Multiply。 我知道您無法使用普通的公共功能執行此操作,因此我將功能虛擬化,但是仍然遇到麻煩。 有人可以向我解釋如何完成嗎? 除了默認的空構造函數,這兩個類都沒有其他構造函數。

這是我的嘗試:

class test_Advanced_Functions
{
    [Test]
    public void test_SquareFunction_Should_return_correct_result()
    {
        // Arrange
        Mock<BasicFunctions> mock = new Mock<BasicFunctions>();
        AdvancedFunctions af = new AdvancedFunctions();

        // Act
        int result = af.Square(5);

        //Assert
        mock.Verify(d => d.Multiply(5, 5), Times.Exactly(1));
    }

假設AdvancedMathBasicMath派生的,那么當Multiply是虛擬的時,您可以使用Moq進行測試:

var mock = new Mock<AdvancedMath>();
mock.Setup(m => m.Multiply(2, 2)).Returns(4);
mock.Object.Square(2);
mock.VerifyAll();

如果您在AdvancedMath使用BasicMath (即,如果Multiply是靜態的並且直接從Square調用),則無法使用Moq測試這種交互。 要了解原因,請參閱此問題

但是,在這種簡單情況下進行基於行為的驗證似乎並不正確。 您需要回答一個問題: “我要測試什么?” Square 起作用或調用了某些方法? 假設此測試有效,則此測試(您現在打算做的事情)僅將責任委托給Multiply 您的Square實現可能會以多種方式發生變化(例如,不使用Multiply ),它將破壞您的測試-不會。

Moq無法修改尚未創建的實例的行為。

您應該通過練習依賴注入來編寫可進行單元測試的類。 由於AdvancedFunctions顯然取決於BasicFunctions ,它應該有一個BasicFunctions傳過來的構造函數的參數,而不是new ING一上來就其自身。

暫無
暫無

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

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