2010-05-05 69 views
2

我有以下嘲笑:起訂量:無法投

var MockHttpContext = new Mock<HttpContextBase>(); 
var MockPrincipal = new Mock<IPrincipal>(); 

MockHttpContext.SetupGet(h => h.User).Returns(MockPrincipal.Object); 

測試此線時出現的錯誤:

var user = (CustomPrincipal)httpContext.User; 

這是錯誤:

Unable to cast object of type 'IPrincipalProxy5c6adb1b163840e192c47295b3c6d696' 
to type 'MyProject.Web.CustomPrincipal'. 

我CustomPrincipal實現IPrincipal接口。那麼,任何人都可以解釋爲什麼我會得到這個錯誤,以及我如何解決它?

+0

除了我的回答,這裏有一個提示:var是一個只有當你知道發生了什麼事情時才使用的捷徑......如果你不知道發生了什麼,使用var,你的代碼將會受到影響。 (儘管使用var不是問題的根源) – 2010-05-05 16:03:39

+0

感謝您的回覆,我將Yuriy的回答標記爲正確的答案,因爲他解釋說moq創建了自己的類。 – Pickels 2010-05-05 17:43:16

回答

4

你不能投它的原因是因爲起訂量是創建自己的類,它實現IPrinciple。特別是IPrincipalProxy5c6adb1b163840e192c47295b3c6d696。但僅僅因爲這兩個類實現了相同的接口,並不意味着你可以從一個類轉換到另一個類。你爲什麼需要投它?爲什麼不能使用MOQ提供的原則上的成員?

+0

因爲我的CustomPrincipal有一些我需要的額外方法。在我有我自己的界面ICustomPrincipal之前,我用它來模擬,但那也不起作用。 – Pickels 2010-05-05 17:33:06

+0

我會將此標記爲答案。我有一個預感Moq會創建它自己的類,但不知道這就是爲什麼我問。 再次感謝。 – Pickels 2010-05-05 17:41:49

8

同樣的原因,這是行不通的

class WoodDuck : IQuack {} 
class RealDuck : IQuack {} 
// 
IQuack myQuacker = new WoodDuck(); 
RealDuck myDuck = (RealDuck) myQuacker;