我有一个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
在示例测试中,当您应该调用传递到模拟回调中的委托时,尝试在模拟回调中定义委托。
查看提供的测试的以下重构,该重构捕获,调用并验证预期行为
[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);
}