我很難提取任何It.Is<T>
參數匹配變量。每當我這樣做,測試失敗。爲什麼我的參數匹配器失敗時,我把它提取到一個變量?
這工作:
calculatorMock
.Setup(x => x.Produce(It.Is<IEnumerable<Report>>(xx => reports.IsEqualTo(xx))))
.Returns(calculatorInputs);
然而,這種失敗:
var argumentMatcher = It.Is<IEnumerable<Report>>(xx => reports.IsEqualTo(xx));
calculatorMock
.Setup(x => x.Produce(argumentMatcher))
.Returns(calculatorInputs);
IsEqualTo
是一個靜態方法返回布爾。
問題是Moq說Produce()
被調用時有一個空列表,當我期待它被包含3個項目的列表調用時。在這個例子中,xx
表示空列表。我不確定爲什麼我需要與我的Moq驗證一致的參數匹配。
我剛剛發現了以下工作:
Expression<Func<IEnumerable<Report>, bool>> expression = x => reports.IsEqualTo(x);
calculatorMock
.Setup(x => x.Produce(It.Is(expression)))
.Returns(calculatorInputs);
有爲什麼It.Is<T>
不能被提取像我上面嘗試做了具體的原因是什麼?
下面是該問題的工作副本:
using System;使用System.Linq.Expressions的 ;使用Moq的 ;使用Xunit的 ;
命名空間MoqArgumentMatcher { 類節目 { 靜態無效的主要(字符串[]參數) { 變種的TestRunner =新的TestRunner();
testRunner.Passes();
testRunner.Fails();
Console.ReadKey();
}
}
public class TestRunner
{
[Fact]
public void Passes()
{
// Arrange
var calculatorMock = new Mock<ICalculator>();
var consumer = new CalculatorConsumer(calculatorMock.Object);
var report = new Report {Id = 1};
// Act
consumer.Consume(report);
// Assert
calculatorMock.Verify(x => x.Produce(
It.Is<Report>(xx => xx.Id == 1)), Times.Once());
}
[Fact]
public void Passes2()
{
// Arrange
var calculatorMock = new Mock<ICalculator>();
var consumer = new CalculatorConsumer(calculatorMock.Object);
var report = new Report { Id = 1 };
// Act
consumer.Consume(report);
// Assert
Expression<Func<Report, bool>> expression = x => x.Id == 1;
calculatorMock.Verify(x => x.Produce(It.Is(expression)), Times.Once());
}
[Fact]
public void Fails()
{
// Arrange
var calculatorMock = new Mock<ICalculator>();
var consumer = new CalculatorConsumer(calculatorMock.Object);
var report = new Report {Id = 1};
// Act
consumer.Consume(report);
// Assert
var argumentMatcher = It.Is<Report>(xx => xx.Id == 1);
calculatorMock.Verify(x => x.Produce(argumentMatcher), Times.Once());
}
}
public class CalculatorConsumer
{
private readonly ICalculator _calculator;
public CalculatorConsumer(ICalculator calculator)
{
_calculator = calculator;
}
public void Consume(Report report)
{
_calculator.Produce(report);
}
}
public interface ICalculator
{
void Produce(Report report);
}
public class Report
{
public int Id { get; set; }
}
}
「失敗」過於含糊的描述。 *它如何失敗? – 2013-03-22 17:22:18
@JonSkeet:你是對的。我已經添加了我能想到的一切。 – gcso 2013-03-22 17:38:17
你能在一個簡短但完整的程序中重現這一點嗎?這將使測試更容易。我懷疑這與類型推斷有關,但很難肯定地說。 (這對Moq文檔鏈接在項目頁面上不起作用沒有幫助!) – 2013-03-22 17:44:00