1

ICallback#Regsiter<T>(Action<T>)以下の(ペアダウンされた)単体テストサンプルで渡されるラムダの入力パラメーターを調整しようとしています(単体テストサンプルのコメントを参照してください)。ラムダは非常に具体的で小さいため、抽象化する必要がないようにしていますが、それが可能かどうかはわかりません。

// IBus interface peek
public interface IBus {
    ICallback Send(IMessage message);
}

// ICallback interface peek
public interface ICallback {
    void Register<T>(Action<T> callback);
}

public enum ReturnCode { Success }

// Controller
public class FooController : AsyncController {
    readonly IBus _bus;
    //...
    // Action being unit tested
    public void BarAsync() {
        _bus
            .Send(ZapMessageFactory.Create())
            .Register<ReturnCode>(x => {
                AsyncManger.Parameters["returnCode"] = x;
            });
    }

    public ActionResult BarCompleted(ReturnCode returnCode) {
        // ...
    }
}

// Controller action unit test
[TestClass]
public class FooControllerTest {
    [TestMethod}
    public void BarTestCanSetAsyncManagerParameterErrorCodeToSuccess() {
        var fooController = ControllerUTFactory.CreateFooController();
        // HOW DO I MOCK THE ACTION DELEGATE PARAMETER TO BE ReturnCode.Success
        // SO I CAN DO THE ASSERT BELOW???
        fooController.BarAsync();
        Assert.AreEqual(ReturnCode.Success, (ReturnCode)fooController.AsyncManager.Parameters["returnCode"]);
    }
}
4

1 に答える 1

0

を使用することMock<T>#Callback()が答えです。

[TestMethod}
public void BarTestCanSetAsyncManagerParameterErrorCodeToSuccess() {
    var mockCallback = new Mock<ICallback>();
    mockCallback
            .Setup(x => x.Register(It.IsAny<ReasonCode>())
            // THIS LINE IS THE ANSWER
            .Callback(action => action(ReasonCode.Success));
    var mockBus = new Mock<IBus>();
    mockBus
            .Setup(x => x.Send(It.IsAny<ZapMessage>())
            .Returns(mockCallback.Object);

    var fooController = new FooController(mockBus.Object);

    fooController.BarAsync();
    Assert.AreEqual(ReturnCode.Success, (ReturnCode)fooController.AsyncManager.Parameters["returnCode"]);
}
于 2012-08-08T12:30:42.763 に答える