Osc*_*ros 5 c# nullable equality reference
在编写单元测试时,我想使用Assert.AreSame(..)一种Nullable<T>类型,我得到了意想不到的结果.然后我意识到下面的代码失败了:
int? k = 10;
Assert.IsTrue(ReferenceEquals(k, k));
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
另外,我怎样才能确保我的方法返回我传递给mock/stub的同一个实例,而不仅仅是这样做return 10?
编辑:
我通常会执行以下操作以确保在单元测试中获得一致的结果:
//Arrange
var result = new string(new[] {'1', '2', '3'});
mock.SetUp(x => x.Method("something").Returns(result);
//Act here
//Assert
Assert.AreSame(result, instance.ValueAssigned);
Run Code Online (Sandbox Code Playgroud)
如果我在return "123"里面做Method(..),上面的测试将失败.我试图找到一种与Nullable一样的方法.
Jon*_*eet 12
这里发生了什么?
两个参数都被装箱,用于不同的对象.
想象一下你的代码实际上是这样的:
int? k = 10;
object x = k; // Boxing operation 1
object y = k; // Boxing operation 2
Assert.IsTrue(ReferenceEquals(x, y));
Run Code Online (Sandbox Code Playgroud)
不要忘记可以为空的值类型仍然是值类型 - 因此当您将它们转换为引用类型表达式时它们会被装箱.
另外,我怎样才能确保我的方法返回我传递给mock/stub的同一个实例,而不仅仅是返回10?
对于价值类型,这个问题根本没有意义.基本上,Assert.AreSame用于引用类型和Assert.AreEqual值类型.请注意,这与可空性无关.Assert.AreSame(10, 10)也会失败.