2014-03-19 70 views
1

我做嘲笑的MVC控制器使用FakeItEasy會話對象返回正確的值訪問會話對象將返回正確的值:ASP.NET MVC FakeItEasy嘲笑會話不會在單元測試

public ActionResult Index() 
{ 
    var value = Session["Key"]; // value = "SomeValue" like it is supposed to 

    ... 
} 

在會話通過這樣的二傳手使用相同的密鑰設置控制器以後,會出現問題:

Session["Key"] = "SomeOtherValue"; 

然後當使用鍵則返回錯誤值

var value = Session["Key"]; // value = "Key" 

嘲笑的會話不回我的嘲笑值了,並沒有任何回報的新的價值,而是它返回密鑰(WTF ?!)。我究竟做錯了什麼?當使用setter時,模擬對象實際發生了什麼?

回答

3

Tim Long有權利。什麼是「正確的價值」? 但是,返回鍵是奇怪的行爲。

我認爲我們在這裏有功能要求的飼料。 (我做了一個:issue 277。) 我認爲使用getter和setter的未配置索引屬性存儲值並在以後返回將是合理的。

更新:問題277已在FakeItEasy 1.21.0中修復。從NuGet獲取它(或更新的版本)。

在此期間,你可以用一些變通辦法像你調用原始方法指出後問題我做了這個新的例子:

[Test] 
public void TestItemProperty() 
{ 
    var mySession = new Dictionary<string, object>(); 
    var session = A.Fake<HttpSessionStateBase>(); 
    A.CallTo(session) 
     .Where(call => call.Method.Name == "set_Item") 
     .Invokes((string key, object value) => mySession[key] = value); 

    A.CallTo(() => session[A<string>._]) 
     .ReturnsLazily((string key) => mySession[key]); 
    A.CallTo(() => session["key1"]).Returns("value1"); 

    A.CallTo(() => session["key1"]).Returns("value1"); 
    Assert.That(session["key1"], Is.EqualTo("value1")); 

    session["key2"] = "value2"; 
    Assert.That(session["key2"], Is.EqualTo("value2")); 

    Assert.That(session["key1"], Is.EqualTo("value1"), "second go"); 
} 
+0

感謝您的迴應布萊爾,我試過你是解決方案,但我得到了:_「在System.Web中發生類型'System.NotImplementedException'的異常。dll但沒有在用戶代碼中處理 其他信息:該方法或操作未實現。「_ 執行session [」key2「] =」value2「時發生此問題 – AfroMogli

+0

啊,drat。我自己的會話任務,而我寫的解決方案。我沒有意識到'HttpSessionStateBase.Item'總是拋出一個NotImplementedException(http://msdn.microsoft.com/en-us/library/cc647353(v=vs.110)。 aspx)。對不起, 在這種情況下,我不會退回到基本實現,而是想實現自己的後備存儲 - 只需在測試類上拋出一個Dictionary並設置setter/getter並 我無法在此時運行Visual Studio_,但稍後會修改答案,如果其他人沒有這樣做。 –

+0

真棒,它工作正常! nk Blair – AfroMogli

2

一個突出的問題可能是:什麼是在這些情況下的正確價值?看起來你是否想要這個索引器像一個模擬器或一個真正的索引器那樣行事。你首先通過配置模擬值來返回固定值,然後你寫入索引器,即使你沒有嘲笑它。那麼FakeItEasy應該如何處理書面價值呢?它現在是否應該返回你已經告訴它返回的模擬值,或者它是否應該知道你現在是新的值?它如何知道?

事實上,你既沒有獲得舊的價值,也沒有新的價值,這有點奇怪,但看看它發生了衝突的指令時發生了什麼?這可能表明您需要採取不同的方法。

您是否考慮過使用其他設置,如ReturnsNextFromSequence()ReturnsLazily()

+0

你是對的蒂姆,對沒有說清楚對不起。在現實世界中,會話設置與嘲笑的值相同。所以我期待Session [「Key」]返回「SomeValue」:)奇怪的是,它返回「Key」作爲我認爲瘋狂的值。我可以嘗試刪除嘲笑的值,看看會發生什麼.. – AfroMogli