Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有函数参数的接口的Moq设置_C#_Unit Testing_Moq - Fatal编程技术网

C# 带有函数参数的接口的Moq设置

C# 带有函数参数的接口的Moq设置,c#,unit-testing,moq,C#,Unit Testing,Moq,我想用moq4.14.7编写一个单元测试。测试方法如下: public IFoo Get(Guid id) { Func<IFoo> getData = () => _repository.Get(id); if (_cache.TryGetAndSet(vaultId, getData, out var result)) { return result; } } public IFoo-Get(Guid-id) { Func

我想用moq4.14.7编写一个单元测试。测试方法如下:

public IFoo Get(Guid id)
{
    Func<IFoo> getData = () => _repository.Get(id);
    if (_cache.TryGetAndSet(vaultId, getData, out var result))
    {
        return result;
    }
}
public IFoo-Get(Guid-id)
{
Func getData=()=>\u repository.Get(id);
if(_cache.TryGetAndSet(vaultId、getData、out var result))
{
返回结果;
}
}
简单地解释一下。我有一个通用的缓存类。它检查缓存中是否存在具有传递的guid的实体。如果不是这样,则调用存储库

现在,我对缓存进行了以下设置:

_cache.Setup
(
    x => x.TryGetAndSet
    (
        _vaultId,
        It.IsAny<Func<IFoo>>(),
        out foo
    )
)
.Returns(true);
\u cache.Setup
(
x=>x.TryGetAndSet
(
_宝库ID,
It.IsAny(),
外福
)
)
.返回(真);
到目前为止,这个测试仍然有效,但是我没有用它实现100%的覆盖率,因为func没有被覆盖


这里有没有比使用
It.IsAny
并获得100%覆盖率更好的方法?

捕获传递给成员的参数并根据需要调用函数

//...

IFoo mockedFoo = Mock.Of<IFoo>();

IFoo foo = null;

_repo.Setup(_ => _.Get(It.IsAny<Guid>()).Returns(mockedFoo);

_cache
    .Setup(_ => _.TryGetAndSet(It.IsAny<Guid>(), It.IsAny<Func<IFoo>>(), out foo))
    .Returns((Guid vid, Func<IFoo> func, IFoo f) => {
        foo = func(); //<-- invoke the function and assign to out parameter.
        return true;
    });

//...

//Assertion can later verify that the repository.Get was invoked
//Assertion can later assert that foo equals mockedFoo
/。。。
IFoo mockedFoo=Mock.Of();
ifoofoo=null;
_repo.Setup(=>quo.Get(It.IsAny()).Returns(mockedFoo);
_缓存
.Setup(=>yGetAndSet(It.IsAny(),It.IsAny(),out foo))
.Returns((Guid vid、Func Func、IFoo f)=>{

foo=func();//该测试覆盖了所显示代码的100%。什么是“因为func未被覆盖”意思是?我猜你需要另一个返回false的测试?不,使用ReSharper UnitTestCoverage工具,只实现了88%的覆盖率,func显示为未覆盖。但是func不是你想要的吗?那么为什么它应该被覆盖呢?没有这个工具的副本,我不知道它在抱怨什么。如果你再添加一个测试at returns false它停止抱怨了吗?顺便说一句,您原来的
GetData
-func肯定从未执行过,因此没有被覆盖,因为您模拟了唯一的调用函数-
TryGetAndSet
。谢谢,这非常有效:)