[英]Using Moq `It.Is` to verify constructor parameter / object with private field
很簡單的例子:
public class Test
{
private int _field;
public Test(int field)
{
_field = field;
}
}
現在我想檢查是否使用類型為Test的參數調用方法,其構造函數參數等於5
_mock.Verify(x => x.Method(It.Is<Test>(constructor parameter equal to 5)));
如果我理解正確,你有一個SUT( SystemUnderTest
,下面),它調用一個依賴項( IDependency
),你已經用類( Test
)的對象IDependency
它,它不暴露公共getter屬性。 就目前而言,您需要使用像反射這樣的黑客來檢查私有值,例如:
public static TReturn GetPrivateField<TIn,TReturn>(TIn instance,
string fieldName)
{
var fieldInfo = typeof(TIn).GetField(fieldName, BindingFlags.NonPublic |
BindingFlags.Instance);
return (fieldInfo != null)
? (TReturn)fieldInfo.GetValue(instance)
: default(TReturn);
}
[Test]
public void EnsureMethod()
{
var mock = new Mock<IDependency>();
var sut = new SystemUnderTest(mock.Object);
sut.DoSomethingGoodWithTest();
mock.Verify(x => x.Method(It.Is<Test>(
t => GetPrivateField<Test, int>(t, "_field") == 5)));
}
顯然這遠非理想,如果可能的話,可以重新考慮這種方法:
如果您無法將訪問可見性更改為Test._field
例如使用公共getter,但是能夠更改正在測試的類的設計,則可以選擇使用可注入工廠來創建Test
類,例如使用像IFactory.Create(int x)
這樣的方法。 這樣您就可以在測試期間模擬工廠,然后攔截Create調用並驗證SUT確實正在創建具有所需構造參數的Test
對象。
而不是測試構造函數,你應該以某種方式測試該屬性是否設置了正確的值。 看看您是否可以使用方法或屬性或任何其他方式公開它。
如果您無法訪問該類以顯示該屬性,則必須查看它的使用方式,即您要查找使用5或10或其他方式初始化的副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.