[英]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));
}
假設AdvancedMath
從BasicMath
派生的,那么當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.