我在編寫新的單元測試時遇到了一些問題。我在代碼示例中的註釋解釋了我的具體問題:初始化變量時使用新內存位置的條件是什麼?
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中存儲值的地址?或者我錯過了一些東西,並且我完全錯誤地提出了錯誤的問題,以發現這裏出了什麼問題?
這是我第一次「官方」單元測試經驗,提前致謝。
我找不到有關'StandardKeyboardMutations'的任何文檔。你有參考嗎? –
自定義類。如果你想看看它的實現,我不得不想出一個不同的例子。 – gordlonious
答案可能在於它的實現。除非你重寫'KeyboardLayout.Equals',否則你會得到'ReferenceEquals'實現。這意味着某種方式'StandardKeyboardMutations。MutateKeyboard'正在返回一個對'*'和'layout'相同的對象的引用 - 可能*不是*你想要的。 –