2014-09-18 47 views
1

我一直在試圖爲我的程序寫一些測試,並得到一個奇怪的問題。爲什麼實體在嘗試添加只讀對象時會複製相關項目?

的分貝看起來像一個TableOne許多TableMany(讓我們這麼說)

初始化之前,每個測試是非常簡單的。在每次測試之前刪除現有的並插入新的。一切正常。

[TestInitialize()] 
public void MyTestInitialize() // Before every test run. 
{ 
    FixtureDbTearDown.TearDown(FixtureDbImport_95.ID); 
    FixtureDbImport_95.SetUp(); 
} 

然後我決定使用重新使用夾具和清理它。所以我讓所有實體類都是靜態只讀的。

現在,只有第一次測試通過,其他人會在重複鍵上拋出異常。逐個運行測試顯示沒有錯誤。

基本上,這是工作

private static void SetUp_Many(MyEntities entity) 
{ 
    TableMany ok1 = new TableMany { smth... }; 
    entity.TableMany.Add(ok1); 
} 

但是這一次不是。

private static readonly TableMany ok_sr = new TableMany { smth.. }; 
private static void SetUp_Many(MyEntities entity) 
{ 
    entity.TableMany.Add(ok_sr); 
} 

調試器顯示第二次調用Add(ok_sr)實體會向父級TableOne添加一條記錄。 TableOne是我的一個精確副本,沒有空值和默認值。

好吧,我可以做一個對象複製之前添加,最有可能的問題是與對象複製,因爲我聲明事物只讀。對?

我對TableOne的重複有點困惑。

任何想法?

+0

我不認爲這是因爲它是隻讀的。也許測試共享相同的上下文? – 2014-09-18 16:30:29

回答

0

成員變量ok_srreadonly但對象ok_sr本身不是!

當成員是readonly時,您不能在第一次分配後爲其分配另一個對象。但是,如果對象本身具有讀/寫屬性或狀態更改方法,則仍可以修改該對象。

這正是發生在這裏。在第一次測試之後,ok_sr已經獲得了一個「TableOne」實例。現在當你執行...

entity.TableMany.Add(ok_sr); 

...父對象標記爲Added爲好。至於EF,它是一個全新的實體,即使它的主鍵有價值。 EF僅覆蓋此關鍵值。

作爲一般性建議,除非是真正的只讀值,即值類型,否則我不會使用靜態成員進行單元測試。在對數據庫單元測試清理

一個非常優雅的方式(這是,事實上,集成測試)是在每個測試的完成,可以開始交易範圍和處置它無需在每個測試做出這種拆除。

+0

謝謝,我有一個奇怪的想法,就是這樣做會節省我一些線。我堅持使用EF5,只要我記得交易是在EF6中引入的。一天... – Dimka 2014-09-20 14:32:16

+0

的確如此,但我提到了'TrasactionScope',它只是一個.Net類。 – 2014-09-20 18:13:33

相關問題