2015-09-30 129 views
-1

我有一個類從基類擴展到另一個dll的基類。單元測試奇怪的東西

public class MyMicroBlogCache : RelatedBase<THZUserInfo, MicroBlogCacheModel, int> 

和在構造函數中,在基類注入ICACHE

public MyMicroBlogCache(ICache cache,.... 

,我使用ICACHE中的方法(例如空隙A())

和我寫一個單元測試,嘲笑ICACHE

var cache = Substitute.For<ICache>(); 
cache.PageRelated<THZUserInfo, MicroBlogCacheModel, int>("My", 2217, 0, 3, out all, true) 
.Returns(
    x => 
    { 
     var list = new List<MicroBlogCacheModel>(); 
     list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
     list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
     list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
     return list; 
    }); 

模擬與NSubstitute

var cache1 = new Mock<ICache>(); 
cache1.Setup(ca => ca.PageRelated<THZUserInfo, MicroBlogCacheModel, int>("My", 2217, 0, 3, out all, true)) 
.Returns(
() => 
{ 
    var list = new List<MicroBlogCacheModel>(); 
    list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
    list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
    list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
    return list; 
}); 

或模擬與MOQ

和奇怪的是:
當我調用基類(RelatedBase)的方法寫入,該方法(例如A())調用模擬ICACHE,它不返回模擬數據。
如果我重寫子類(MyMicroBlogCache)中的方法,並使用相同的代碼(覆蓋並從基類複製代碼),它會返回模擬數據。
如果我重寫,並使用base.A(...),它不會返回模擬數據。
因此,當在基類中的代碼出現錯誤,並且在子類中的代碼時,它是正確的。
如果我創建一個類實現ICache,那麼
NSubstitute和Moq都是一樣的。
我嘗試這與vs2015,vs2013; .NET 4.5
爲什麼會發生,以及如何解決它

更新:

 var cache1 = new Mock<ICache>(MockBehavior.Strict); 
     cache1.Setup(ca => ca.PageRelated<THZUserInfo, MicroBlogCacheModel, int>("My", 2217, 0, 3, out all, true)) 
      .Returns(
      () => 
      { 
       var list = new List<MicroBlogCacheModel>(); 
       list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
       list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
       list.Add(new MicroBlogCacheModel { Id = 1, UserId = 2217 }); 
       return list; 
      }); 

然後測試方法調用

var r = my.GetRelatedPage(2217, 0, 3, out all, true); 

在基類中它叫

var list = cache.PageRelated<TMainKey, TChild, TMainKey>("My", key, skip, take, out all, desc); 

鍵= 2217,跳過= 0,取= 3,DESC = TRUE,

回答

0

你有一個通用的基礎類:

RelatedBase<T1, T2, T3> 

你也有不一般的參數繼承的類,它指定了鍵入每個T1,T2,T3。

隨着泛型,RelatedBase<THZUserInfo, MicroBlogCacheModel, int>是不一樣的類型RelatedBase<T1, T2, T3>

現在:在您的設置,您明確設置ca.PageRelated<THZUserInfo, MicroBlogCacheModel, int>

如果你調用基類中的方法(一般的)使用不同的參數類型,那麼它將不會與設置的調用完全相同,因此將返回該方法的默認值。

嘗試使用new Mock<ICache>(MockBehavior.MockStrict)實例化你的模擬,你應該有一個MockException證實這一點。

然後,將類型參數視爲正確的參數:如果它們不匹配,則安裝程序不適用。

希望這有助於:)

+0

B:和AルM ,所以如果我使用B.m,它爲m 。我不明白爲什麼你說這不一樣,你能解釋一下嗎? – chenZ

+0

,我嘗試新的模擬(MockBehavior.MockStrict)它不拋出MockException – chenZ

+0

你可以添加你的問題嗎? –