如何测试事件处理程序的结果

问题描述 投票:0回答:1

我有一个ViewModel,它在构造函数中接收带有Eventhandler的接口:

public VehiclesViewModel(IVehicles vehicles)
{
    _vehicles = vehicles;
    VehicleRows = new ObservableCollection<VehicleRowViewModel>();
    _vehicles.ListVehicles("secret", callback);
}

回调将所有列出的载具添加到ObservableCollection中:

private void callback(object sender, MyAsyncCompletedEventArgs e)
{
    if (e.Result is Vehicle[] vehicles)
    {
        foreach (var vehicle in vehicles)
        {
            VehicleRows.Add(new VehicleRowViewModel {Name = vehicle.Name});
        }
    }
}
public ObservableCollection<VehicleRowViewModel> VehicleRows { get; set; }

Vehicle和VehicleRowViewModels只是简单的类:

public class VehicleRowViewModel
{
    public string Name { get; set; }
}

public class Vehicle
{
    public string Name { get; set; }
}

这是其余的代码:

public interface IVehicles
{
    void ListVehicles(string category, MyAsyncCompletedEventHandler callback);
}

public delegate void MyAsyncCompletedEventHandler(object sender, MyAsyncCompletedEventArgs e);

public class MyAsyncCompletedEventArgs : AsyncCompletedEventArgs
{
    public MyAsyncCompletedEventArgs(Exception ex) : base(ex, true, null)
    {
    }

    public object Result { get; set; }
}

现在,我想测试车辆数量是否正确添加到VehicleRows:

[TestFixture]
public class VehiclesViewModelTests
{
    [Test]
    public void AllVehiclesFromCallBackEndUpInProperty()
    {
        var vehiclesMock = new Mock<IVehicles>();
        vehiclesMock.Setup(x => x.ListVehicles(It.IsAny<string>(), It.IsAny<MyAsyncCompletedEventHandler>())).Callback<string, MyAsyncCompletedEventHandler>(
            (s, c) =>
            {
                c = (sender, args) =>
                    args.Result = new List<Vehicle>
                    {
                        new Vehicle {Name = "TR3B"},
                        new Vehicle {Name = "Aurora"},
                        new Vehicle {Name = "HAUC"}
                    }.ToArray();
            });
        var testee = new VehiclesViewModel(vehiclesMock.Object);
        Assert.AreEqual(3,testee.VehicleRows.Count);
    }
}

但是测试失败。如何模拟回调以正确测试ViewModel?

我有一个带有示例的github回购:https://github.com/tbremeyer/TestEventHandler.git

c# delegates nunit moq
1个回答
0
投票

在示例测试中,当您应该调用传递到模拟回调中的委托时,尝试在模拟回调中定义委托。

查看提供的测试的以下重构,该重构捕获,调用并验证预期行为

[Test]
public void AllVehiclesFromCallBackEndUpInProperty() {
    //Arrange
    MyAsyncCompletedEventHandler handler = null;

    var vehiclesMock = new Mock<IVehicles>();
    vehiclesMock
        .Setup(_ => _.ListVehicles(It.IsAny<string>(), It.IsAny<MyAsyncCompletedEventHandler>()))
        .Callback<string, MyAsyncCompletedEventHandler>((secret, callback) => {
            //capture the delegate for later use;
            handler = callback;
        });

    var subjectUnderTest = new VehiclesViewModel(vehiclesMock.Object);
    //check to make sure the hanler as been set at this point
    Assert.IsNotNull(handler);

    var vehicles = new List<Vehicle> {
        new Vehicle {Name = "TR3B"},
        new Vehicle {Name = "Aurora"},
        new Vehicle {Name = "HAUC"}
    }.ToArray();
    int expected = vehicles.Length;
    var eventArgs = new MyAsyncCompletedEventArgs(null) {
        Result = vehicles
    };

    //Act (invoke the delegate)
    handler.Invoke(vehiclesMock.Object, eventArgs);

    //Assert
    int actual = subjectUnderTest.VehicleRows.Count;
    Assert.AreEqual(expected, actual);
}
© www.soinside.com 2019 - 2024. All rights reserved.