Я использую Moq для модульного тестирования класса. Как я могу настроить поддельный IP-процессор, чтобы установить для свойства Successful параметра CreateRequest значение true? Это вообще возможно? Я посмотрел на функцию обратного вызова, предоставляемую платформой Moq, но не уверен, что она может делать то, что мне нужно в этом сценарии.

public class CreateRequest
{
    public bool Successful { get; set; }
}

public interface IProcessor()
{
    public void Process(CreateRequest createRequest);
}

public class TheClassIAmUnitTesting()
{
    public void SomeMethod()
    {
        CreateRequest createRequest = new CreateRequest();
        processor.Process(createRequest);

        if (createRequest.Successful)
        {
             // do something
        }
        else
        {
             // do somethign else
        }
    }
}

[TestMethod]
public void TheUnitTest()
{
    Mock<IProcessor> mock = new Mock<IProcessor>

    this.mock.setup(x=>x.Process()) //<= what do i do here to have the mock set the boolean Successful property on the CreateRequest parameter to true?
}

2
party_Rob 30 Май 2019 в 21:33

2 ответа

Лучший ответ

Воспользуйтесь обратным вызовом и получите доступ к переданному аргументу

[TestMethod]
public void TheUnitTest() {
    //Arrange
    Mock<IProcessor> mock = new Mock<IProcessor>();

    mock.Setup(_ => _.Process(It.IsAny<CreateRequest>()))
        .Callback((CreateRequest arg) => arg.Successful = true)
        .Verifiable();

    var subject = new TheClassIAmUnitTesting(mock.Object);

    //Act
    subject.SomeMethod();

    //Assert
    mock.VerifyAll();
}

Ссылка Быстрый запуск Moq: обратные вызовы

1
Nkosi 30 Май 2019 в 18:54

Вы можете попробовать это

mock.Setup(x=>x.Process(It.IsAny<CreateRequest>()))
  .Callback<CreateRequest>(cr => cr.Successful = true)
1
Avin Kavish 30 Май 2019 в 18:40