gpt4 book ai didi

c# - 使用 Moq `It.Is` 验证带有私有(private)字段的构造函数参数/对象

转载 作者:太空狗 更新时间:2023-10-30 01:04:17 26 4
gpt4 key购买 nike

非常简单的例子:

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) 不公开公共(public) getter 属性。就目前而言,您需要使用类似反射的 hack 来检查私有(private)值,例如:

  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,例如使用公共(public) getter,但能够更改被测试类的设计,另一种方法是使用可注入(inject)工厂来创建 Test 类,例如使用类似 IFactory.Create(int x) 的方法。这样您就可以在测试期间模拟工厂,然后拦截 Create 调用并验证 SUT 确实在创建具有所需构造参数的 Test 对象。

关于c# - 使用 Moq `It.Is` 验证带有私有(private)字段的构造函数参数/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com