是否可以在引用类型参数上设置模拟对象的方法值?

Is it possible to have mocked object's method set value on reference type parameter?

我正在使用 Moq 对 class 进行单元测试。如何设置模拟的 IProcessor 以将 CreateRequest 参数上的 Successful 属性 设置为 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?
}

你可以试试这个

mock.Setup(x=>x.Process(It.IsAny<CreateRequest>()))
  .Callback<CreateRequest>(cr => cr.Successful = true)

使用回调并访问传递的参数

[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 Quickstart: Callbacks