我有看起来像这样的方法:
public A Method(int a, int b){
return new A().AMethod(a, b);
}
现在我正在通过测试我得到的对象在对 AMethod 操作“a”和“b”后具有预期值进行测试,但对我来说,这看起来像一个集成测试,我正在测试第一个方法和里面的 AMethod . 我想知道如何在创建新对象 A 后测试隔离的方法以知道“a”和“b”被传递给 AMethod,并且它们按该顺序传递,而不是例如倒置。
我有看起来像这样的方法:
public A Method(int a, int b){
return new A().AMethod(a, b);
}
现在我正在通过测试我得到的对象在对 AMethod 操作“a”和“b”后具有预期值进行测试,但对我来说,这看起来像一个集成测试,我正在测试第一个方法和里面的 AMethod . 我想知道如何在创建新对象 A 后测试隔离的方法以知道“a”和“b”被传递给 AMethod,并且它们按该顺序传递,而不是例如倒置。
您始终可以使用模拟框架对其进行测试。使用 ie MOQ 框架创建模拟。比你可以测试的参数。会是这样的
这不是确切的代码,它有一些错误,但可以给你一个想法。
var mocmethod = new Mock<IMethodA>(pass your parameters here)
mockmethod.setup=(x=>x.a(It.Isany<int>)......).Returns(A),
mockmethod.Verify(r=>r.a(It.Is<int>(r=>r.b == "Something"), It.Is<int>(i=>i > 17)))
我可以在这里提出 2 个解决方案:
引入A
工厂依赖。
创建新A
实例的责任可以委托给第三方接口。例如,它可能是IAFactory
。Method()
应该使用这个工厂来创建新A
实例而不是A
直接创建。
在这种情况下,您可以存根IAFactory
:它应该返回A
模拟。您可以测试AMethod
使用适当参数调用的方法。
断言AMethod()
执行结果。
例如:如果AMethod()
初始化实例的 2 个属性 (PropA
和PropB
) A
,则测试应检查这些属性是否包含有效值。
在那种情况下,测试不会考虑属性的实际初始化方式。它只是检查最终结果是否符合预期。