单元测试奇怪的事情

时间:2015-09-30 05:35:05

标签: visual-studio moq mstest nsubstitute

我有一个基类扩展,另一个基类是基类。

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 =真,

1 个答案:

答案 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来确认。

然后,将类型参数视为正确的参数:如果它们不匹配,则设置不适用。

希望这会有所帮助:)