1

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);

IsEqualToboolを返す静的メソッドです。

問題は、MoqがProduce()、3つのアイテムを含むリストで呼び出されることを期待しているときに、nullリストで呼び出されたと言っていることです。この例で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>上記のように抽出できない特定の理由はありますか?

問題の作業コピーは次のとおりです。

システムを使用する; System.Linq.Expressionsを使用します。Moqを使用します。Xunitを使用します。

名前空間MoqArgumentMatcher{クラスプログラム{staticvoidMain(string [] args){var testRunner = new 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; }
}

}

4

1 に答える 1