微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最小起订量功能参数

如何解决最小起订量功能参数

我有一个使用 Func 参数的单元测试,但我似乎无法使用 MOQ。查看 StackOverflow 上 Func 参数的其他示例,这就是我认为应该起作用的:

要测试的代码

public class PatternManager : IPatternManager
{
    private readonly ICacheManager _cacheManager;
    private readonly IDataRepo _data;

    public PatternManager(ICacheManager cacheManager,IDataRepo dataRepo)
    {
        _cacheManager = cacheManager;
        _data = dataRepo;
    }

    public List<Pattern> GetAllPatterns()
    {
        var allPatterns = _cacheManager.Get(() => _data.GetAllPatterns(),nameof(_data.GetAllPatterns));

        return allPatterns;
    }

    public Pattern GetBestPattern(int[] ids)
    {
        var patternList = GetAllPatterns().Where(w => w.PatternId > 1);

        ... More code...
    }
    ...
}


public interface ICacheManager
{
    T Get<T>(Func<T> getmethodIfNotCached,string cacheName = null,int? cacheDurationInSeconds = null,string cachePath = null);

}

不是我期望从 GetAllPatterns() 获得的 Pattern 列表,而是空值。

[Test]
public void PatternManager_GetBestPattern()
{
    var cacheManager = new Mock<ICacheManager>();
    var dataRepo = new Mock<IDataRepo>();

    dataRepo.Setup(d => d.GetAllPatterns())
                    .Returns(GetPatternList());

    cacheManager.Setup(s => s.Get(It.IsAny<Func<List<Pattern>>>(),"",100,"")) // Has optional params
                    .Returns(dataRepo.Object.GetAllPatterns());

    patternManager = new PatternManager(cacheManager.Object,dataRepo.Object);

    int[] pattern = { 1,2,3};

    var bestPattern = patternManager.GetBestPattern(pattern);

    Assert.AreEqual(1,bestPattern.PatternId);
}

private static List<Pattern> GetPatternList()
{ 
    ... returns a list of Pattern
}

这个设置有什么问题?

解决方法

默认情况下,模拟返回 null,因为设置与调用模拟成员时实际传递的设置不同。

查看被测成员调用了什么

//...

var allPatterns = _cacheManager.Get(() => _data.GetAllPatterns(),nameof(_data.GetAllPatterns));

//...

这很可能是一个 Func<List<Pattern>> 和字符串 "GetAllPatterns",其他可选参数默认为可选默认值。

现在看看测试中设置了什么

//...

cacheManager
    .Setup(s => s.Get(It.IsAny<Func<List<Pattern>>>(),"",100,"")) // Has optional params
    .Returns(dataRepo.Object.GetAllPatterns());

//...

空字符串和实际的 int 值设置为预期值,而这不是被测成员实际调用的值。

Mock 因此不知道如何处理在执行测试时传递的实际值,因此将默认为 null

使用 It.IsAny<>

重构设置以接受相应参数的任何值
//...

cacheManager
    .Setup(s => s.Get<List<Pattern>>(It.IsAny<Func<List<Pattern>>>(),It.IsAny<string>(),It.IsAny<int?>(),It.IsAny<string>()))
    .Returns((Func<List<Pattern>> f,string cn,int? cd,string cp) => f()); //Invokes function and returns result

//...

并注意使用委托来捕获 Returns 中的参数。这样就可以像在被测成员中那样调用实际函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?