【问题标题】:unit test strange things单元测试奇怪的东西
【发布时间】:2015-09-30 05:35:04
【问题描述】:

我有一个从基类扩展而来的类,基类在另一个 dll 中。

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;
});

或模拟起订量

奇怪的是:
当我在基类(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);

key=2217,skip=0,take=3,desc=true,

【问题讨论】:

    标签: visual-studio moq mstest nsubstitute


    【解决方案1】:

    你有一个通用的基类:

    RelatedBase<T1, T2, T3>
    

    您还有一个没有泛型参数的继承类,它指定每个 T1、T2、T3 的类型。

    由于泛型,RelatedBase&lt;THZUserInfo, MicroBlogCacheModel, int&gt;RelatedBase&lt;T1, T2, T3&gt; 的类型不同

    现在:在您的设置中,您明确设置 ca.PageRelated&lt;THZUserInfo, MicroBlogCacheModel, int&gt;

    如果您使用不同的参数类型调用基类(泛型)上的方法,那么它将与设置的调用不完全相同,因此,将返回该方法的默认值.

    尝试使用new Mock&lt;ICache&gt;(MockBehavior.MockStrict) 实例化您的Mock,您应该有一个MockException 来确认这一点。

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

    希望这会有所帮助:)

    【讨论】:

    • B:A 和 A 调用 m,所以如果我使用 B.m,它是 m。我不不明白为什么你说的不一样,你能解释一下吗?
    • 我尝试新的 Mock(MockBehavior.MockStrict) 它不会抛出 MockException
    • 能否将起订量设置添加到您的问题中?
    • 这是唯一的设置吗?如果没有,也许发布整个测试,它会更容易。
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2018-12-20
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多