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 非常受欢迎。

我的问题是:

  1. 因为我在下面的 CarViewModel 中没有任何依赖项,所以我认为我不需要在测试中模拟 class。根据我的理解,它是受测试的主题,不应被嘲笑。只应模拟依赖项。这是正确的吗?
  2. 我如何进行单元测试以确认我的 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);
}