我有一个基类扩展,另一个基类是基类。
public class MyMicroBlogCache : RelatedBase<THZUserInfo, MicroBlogCacheModel, int>
并在构造函数中注入一个ICache
public MyMicroBlogCache(ICache cache,....
在基类中,我在方法中使用ICache(例如void 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)中调用方法write时,方法(例如A())调用mock 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 =真,
答案 0 :(得分: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
来确认。
然后,将类型参数视为正确的参数:如果它们不匹配,则设置不适用。
希望这会有所帮助:)