您可以使用It.Is(..)
表達式在您的AssemblyInitialize
中定義一組約定,並在測試設置期間使用它們。
也很容易定義它周圍的一些輔助方法。例如,您可以使用ItExt.IsConventional<T>()
方法來鏡像It.IsAny<T>()
語法。這裏是一個可能的實現:
public static class ItExt
{
private static readonly Dictionary<Type, object> RegisteredConventions = new Dictionary<Type, object>();
public static void RegisterConvention<T>(Func<T> convention)
{
RegisteredConventions.Add(typeof(T), convention);
}
public static T IsConventional<T>()
{
Func<T> conventionFunc = (Func<T>)RegisteredConventions[typeof(T)];
return conventionFunc();
}
}
與用法:
[TestClass]
public class FooTests
{
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
ItExt.RegisterConvention(() => It.Is<int?>(n => n.HasValue));
}
[TestMethod]
public void FooTest()
{
// Arrange
Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.Setup(f => f.Bar(ItExt.IsConventional<int?>()))
.Verifiable();
// Act
fooMock.Object.Bar(1);
// Assert
fooMock.VerifyAll(); // throws
}
}
注意該公約的定義必須被存儲爲Func<T>
,從而對於Mock<T>.Setup
調用內部評估中可用的表達。