Moq回复IEnumerable退出返回空?

时间:2017-02-03 15:34:01

标签: c# unit-testing moq

我正在尝试设置一个模拟对象,以便它只将一个输入变量回送给调用者。

_resultThrottler = new Mock<IResultThrottler>();
_resultThrottler
    .Setup(x => x.Throttle(It.IsAny<IEnumerable<ProductResult>>(), It.IsAny<Guid>()))
    .Returns((IEnumerable<ProductResult> input, Guid resultSetId) => input );

然而,当实际调用时,输出始终为空。

var throttledResults = _resultThrottler.Throttle(results, resultSetId).ToList();

我可能做错了什么?

编辑:根据要求:

public interface IResultThrottler
{
    IEnumerable<TType> Throttle<TType>(IEnumerable<TType> collectionToThrottle,
        Guid sessionId) where TType : ProductResult;
}

变量results的完整初始化序列相当复杂,但在测试中,它作为长度为5的System.Collections.Generic<IEnumerable<(type that inherits from ProductResult)>>类型的对象进入,并且从长度为零的模拟对象出来

1 个答案:

答案 0 :(得分:1)

似乎Moq并不喜欢我试图使用继承类型而不是实际的特定类型进行模拟。

我已移动代码以获取类型参数 -

public class ResultThrottlerStubBuilder<TType> where TType : ProductResult
{
    private Mock<IResultThrottler> _resultThrottler;
    public IResultThrottler Build()
    {
        _resultThrottler = new Mock<IResultThrottler>();
        _resultThrottler
            .Setup(x => x.Throttle(It.IsAny<IEnumerable<TType>>(), It.IsAny<Guid>()))
            .Returns((IEnumerable<TType> input, Guid resultSetId) => input );

        return _resultThrottler.Object;
    }
}

并更改了测试代码以匹配,现在测试通过了。感谢评论者在正确的方向上轻推我的想法: - )