【发布时间】:2018-07-16 17:24:09
【问题描述】:
我已测试检查更改后引发的事件中的 ref 参数值。当我创建真正的类时测试工作正常,但是当我尝试模拟类时它失败了。简单代码示例:
[TestClass]
public class Fixture
{
[TestMethod]
public void CheckRealClass()
{
// this test passed
var classToTest = new NumberChangerClass();
CheckClass(classToTest);
}
[TestMethod]
public void CheckMockedClass()
{
// this test failed
var classToTest = new Mock<NumberChangerClass>() { CallBase = true };
CheckClass(classToTest.Object);
}
private void CheckClass(NumberChangerClass numberChangerClass)
{
// Arrange
var number = 1;
numberChangerClass.StorageChanged += (sender, args) =>
{
Assert.AreEqual(2, number);
};
// Act
numberChangerClass.SetValue(ref number, 2);
}
}
public class NumberChangerClass
{
public event EventHandler StorageChanged;
public virtual void SetValue(ref int storage, int newValue)
{
storage = newValue;
StorageChanged?.Invoke(this, null);
}
}
在CheckMockedClass 中,number 实际上已更改,但仅在代码从SetValue 方法退出之后。
我使用最小起订量版本 4.2.1409.1722,但它在最新版本 (4.8.1) 中也不起作用。
有没有办法让CheckMockedClass通过?
更新:
我已在 moq github 中打开问题:link
简短回答:对此无能为力。
更多细节:
您观察到的行为是 DynamicProxy(Moq 所依赖的)在方法调用拦截期间如何处理引用参数的直接结果(记录在 https://github.com/castleproject/Core/blob/master/docs/dynamicproxy-by-ref-parameters.md):在调用拦截期间,参数被缓冲在一个单独的位置并且只在拦截结束时写回,这就是为什么 refparameters 以延迟/延迟的方式更新。不幸的是,对此无能为力。
当我检查Assert.AreEqual(2, number);时,我仍然试图找到一种方法来获取更新的号码
【问题讨论】:
-
你为什么要嘲笑被测类?
-
这只是简单的代码。在实际情况下,我的类要复杂得多,我需要设置类的一些方法。
标签: c# unit-testing moq