我有一个模拟(使用Moq),它接收IEnumerable<T>
并返回该集合中的项目(T
)。在尝试设置模拟时,我遇到了这个问题:
mockCollectionsSelector.SetupSequence(s => s.SelectRandomFrom<Feat>(It.Is<IEnumerable<Feat>>(fs => fs.All(f => f.Name == FeatConstants.FavoredEnemy))))
.Returns((IEnumerable<Feat> fs) => fs.ElementAt(1))
Cannot convert lambda expression because it is not a delegate type
Moq中引用参数的所有示例都具有与传入的相同的返回类型,因此甚至可能无法实现 - 如果是这样,那么我将不得不找到另一种方法来执行此操作。否则,我不确定我在这里做错了什么。
答案 0 :(得分:1)
我通过用int:
替换Feat类来简化代码using System.Collections.Generic;
using System.Linq;
using Moq;
using NUnit.Framework;
namespace Tests
{
[TestFixture]
public class Tests
{
[Test]
public void ShouldDoSomething()
{
Mock<ICollectionSelector> mockCollectionsSelector = new Mock<ICollectionSelector>();
mockCollectionsSelector
.Setup(s => s.SelectRandomFrom(It.Is<IEnumerable<int>>(fs => fs.All(f => true))))
.Returns((IEnumerable<int> fs) => fs.ElementAt(1));
//.Returns<IEnumerable<int>>(fs => fs.ElementAt(1)); // this also works and is more readable I guess
var selector = mockCollectionsSelector.Object;
var number = selector.SelectRandomFrom(new[] {1, 2, 3, 4, 5, 6, 7});
Assert.IsTrue(number == 2);
}
}
public interface ICollectionSelector
{
int SelectRandomFrom<T>(IEnumerable<T> @is);
}
}
工作正常。 &#39;测试&#39;经过。也许尝试将您的Moq库升级到最新版本?我在.Net 4.5.2上使用了4.2.1507.118