我在编写新的单元测试时遇到了一些问题。我在代码示例中的注释解释了我的具体问题:
KeyboardLayout layout
= Engine.ParseLayout(Dimensions.Create(300, 300), "FooBar", provider);
var dweeb = layout.Layout.SelectMany(t => t);
//Parsed layout is not a mutant
Assert.IsTrue(!layout.IsMutant);
KeyboardLayout newLayout = StandardKeyboardMutations.MutateKeyboard(layout);
var newb = newLayout.Layout.SelectMany(t => t);
//I don't understand why this test fails. They should be stored in seperate memeory locations and therefore not equal by reference comparison.
//Unless of course saying var x = foo doesn't always provide a fresh memory location for the value of foo.
Assert.AreNotEqual(layout, newLayout);
此行Assert.AreNotEqual(layout, newLayout);
始终失败。
我不知道为什么到目前为止我一直在做这个假设(在评论中说明):声明变量总是执行存储过程到新的内存位置。 (一个当前正在运行的程序没有使用它。)
要清楚,问题是,在c#中, var x = foo;
总是使用新的存储单元吗?如果没有,使用一个标准是什么?或者它可能总是在x中存储值的地址?或者我错过了什么,我完全在问错误的问题,找到错在哪里?
这是我第一次“官方”单元测试经验,提前谢谢。
答案 0 :(得分:3)
您正在寻找Assert.AreSame而不是Assert.AreEqual。
Assert.AreSame()
断言检查参数是否引用相同的对象(您提到“相同的内存位置”),而Assert.AreEqual()
(和AreNotEqual()
)断言检查是否相等对于基础对象,即它会检查a.Equals(b)
,即使a
和b
引用不同的对象,它也可以成立。
答案 1 :(得分:2)
var x = foo
;总是使用新的记忆细胞?
是的,x
永远是新的记忆。但是,并不代表您认为的含义。
或者它可能始终存储在
x
地址value
中
是的,如果value
类型是引用类型。 e.g。
var x = new MyClass();
var y = x;
x
和y
都包含引用(您可以将其视为地址)到内存的同一个内存,其中MyClass()
实例实际存储。
对于价值类型,它是完全不同的:
var x = new MyStruct();
var y = x;
分配给y
时复制整个对象。没有引用,对象本身存储在y
。