Xamarin Forms 单元测试命令
Xamarin Forms Unit Testing a Command
我正在尝试对 Xamarin.Forms 中的命令进行单元测试。
我以我的视图模型 class 为例
public class CarViewModel
{
public Command SelectedCommand { get; } => new Command(OnSelected);
public Car SelectedCar
{
get { return _selectedCar; }
private set { _selectedCar = value; }
}
private void OnSelected(object obj)
{
if (obj is Car car)
{
SelectedCar = car;
}
}
}
这个 class 是我视图的 BindingContext
上面的 SelectedCommand
在用户点击 ListView 项目时被触发,所以它是一个绑定到 Command
在 XAML 使用 TapGestureRecognizer
like
<TapGestureRecognizer Command="{Binding SelectedCommand}" .../>
我正在尝试对此 class 进行单元测试,所以我的 CarViewModel
class 在我的测试中是被测对象 (SUT)。
我刚开始研究模拟库/隔离框架,我发现 Moq 非常受欢迎。
我的问题是:
- 因为我在下面的
CarViewModel
中没有任何依赖项,所以我认为我不需要在测试中模拟 class。根据我的理解,它是受测试的主题,不应被嘲笑。只应模拟依赖项。这是正确的吗?
- 我如何进行单元测试以确认我的
SelectedCommand
已被调用并且它已设置 SelectedCar
属性?如果我在上面的 1 中是正确的,那么甚至不需要 Moq 来测试它,因为我没有依赖性来模拟我的 CarViewModel
class.
根据示例中的当前代码,确实不需要模拟任何东西。
使用已知参数在 SUT 上执行命令并通过 SelectedCar
验证预期行为。
[Test]
public void SelectedCommand_Should_Set_SelectedCar {
// Arrange
var expected = new Car();
var subject = new CarViewModel();
// Act
subject.SelectedCommand.Execute(expected);
// Assert
var actual = subject.SelectedCar;
Assert.AreEqual(expected, actual);
}
我正在尝试对 Xamarin.Forms 中的命令进行单元测试。
我以我的视图模型 class 为例
public class CarViewModel
{
public Command SelectedCommand { get; } => new Command(OnSelected);
public Car SelectedCar
{
get { return _selectedCar; }
private set { _selectedCar = value; }
}
private void OnSelected(object obj)
{
if (obj is Car car)
{
SelectedCar = car;
}
}
}
这个 class 是我视图的 BindingContext
上面的 SelectedCommand
在用户点击 ListView 项目时被触发,所以它是一个绑定到 Command
在 XAML 使用 TapGestureRecognizer
like
<TapGestureRecognizer Command="{Binding SelectedCommand}" .../>
我正在尝试对此 class 进行单元测试,所以我的 CarViewModel
class 在我的测试中是被测对象 (SUT)。
我刚开始研究模拟库/隔离框架,我发现 Moq 非常受欢迎。
我的问题是:
- 因为我在下面的
CarViewModel
中没有任何依赖项,所以我认为我不需要在测试中模拟 class。根据我的理解,它是受测试的主题,不应被嘲笑。只应模拟依赖项。这是正确的吗? - 我如何进行单元测试以确认我的
SelectedCommand
已被调用并且它已设置SelectedCar
属性?如果我在上面的 1 中是正确的,那么甚至不需要 Moq 来测试它,因为我没有依赖性来模拟我的CarViewModel
class.
根据示例中的当前代码,确实不需要模拟任何东西。
使用已知参数在 SUT 上执行命令并通过 SelectedCar
验证预期行为。
[Test]
public void SelectedCommand_Should_Set_SelectedCar {
// Arrange
var expected = new Car();
var subject = new CarViewModel();
// Act
subject.SelectedCommand.Execute(expected);
// Assert
var actual = subject.SelectedCar;
Assert.AreEqual(expected, actual);
}