[英]Using Moq with Linq Any()
我有类似下面的设置:
[TestMethod]
public void NoIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
Mock<IEnumerable<int>> mockIntegers = new Mock<IEnumerable<int>>(MockBehavior.Strict);
mockBar
.SetupGet(x => x.Integers)
.Returns(mockIntegers.Object);
mockIntegers
.Setup(x => x.Any())
.Returns(false);
Assert.IsFalse(new Foo(mockBar.Object).AreThereIntegers());
}
public interface IBar
{
IEnumerable<int> Integers { get; }
}
public class Foo
{
private IBar _bar;
public Foo(IBar bar)
{
_bar = bar;
}
public bool AreThereIntegers()
{
return _bar.Integers.Any();
}
}
}
当它运行时,它无法初始化模拟
Test method NoIntegers threw exception: System.NotSupportedException: Expression references a method that does not belong to the mocked object: x => x.Any<Int32>()
我尝试以几种形式添加It.IsAny()
:
mockIntegers
.Setup(x => x.Any(It.IsAny<IEnumerable<int>>(), It.IsAny<Func<int, bool>>()))
.Returns(false);
// No method with this signiture
mockIntegers
.Setup(x => x.Any(It.IsAny<Func<int, bool>>()))
.Returns(false);
// Throws: Test method NoIntegers threw exception:
// System.NotSupportedException:
// Expression references a method that does not belong to the mocked object:
// x => x.Any<Int32>(It.IsAny<Func`2>())
为了让它运行,我需要模拟什么?
您只需要模拟Integers
属性。 没有必要模拟Any()
(你不能这样做,因为它是一个扩展方法),因为它是SUT的一部分。 以下是您应该如何处理两种情况:
[TestMethod]
public void NoIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
mockBar.SetupGet(x => x.Integers)
.Returns(new List<int>());
Assert.IsFalse(new Foo(mockBar.Object).AreThereIntegers());
}
[TestMethod]
public void HasIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
mockBar.SetupGet(x => x.Integers)
.Returns(new List<int>{ 3, 5, 6});
Assert.IsTrue(new Foo(mockBar.Object).AreThereIntegers());
}
它不起作用,因为Any()
方法不是由IEnumerable<T>
接口直接公开的,而是在Enumerable
上定义为扩展方法 。
我不认为你可以在任何模拟上设置对Any()
的调用,因为它本质上是一个静态方法。
在这种情况下,我认为最好使用IEnumerable<int>
(例如:int数组)的实例,可以设置为空/非空,具体取决于您正在测试的内容。
固定!
不漂亮,但这是需要的嘲弄:
[TestMethod]
public void NoIntegers()
{
Mock<IBar> mockBar = new Mock<IBar>(MockBehavior.Strict);
Mock<IEnumerable<int>> mockIntegers = new Mock<IEnumerable<int>>(MockBehavior.Strict);
Mock<IEnumerator<int>> mockEnumerator = new Mock<IEnumerator<int>>(MockBehavior.Strict);
mockBar
.SetupGet(x => x.Integers)
.Returns(mockIntegers.Object);
mockIntegers
.Setup(x => x.GetEnumerator())
.Returns(mockEnumerator.Object);
mockEnumerator.Setup(x => x.MoveNext()).Returns(false);
mockEnumerator.Setup(x => x.Dispose());
Assert.IsFalse(new Foo(mockBar.Object).AreThereIntegers());
}
public interface IBar
{
IEnumerable<int> Integers { get; }
}
public class Foo
{
private IBar _bar;
public Foo(IBar bar)
{
_bar = bar;
}
public bool AreThereIntegers()
{
return _bar.Integers.Any();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.