3

我有一个类(为简单起见,我将其称为 MyCustomCommand),它基本上接受两个委托来执行和 CanExecute。此类实现 ICommand。然后,这允许我在我从 XAML 绑定到的视图模型中声明一个属性。

问题是我遇到了一个场景,由于我的一个名为 ApplyChangesCommand 的命令中存在依赖关系,我需要模拟视图模型。我不相信依赖是一件坏事。在这一点上是比较必要的。

由于这种依赖关系,我使用模拟设置来创建一个回调,它基本上“什么都不做”来规避依赖关系。

现在我已经模拟了视图模型,任何实例属性现在当然都是空的。这包括我的命令。

简单的例子是:

private void _somethingToExecute;
public ICommand ApplyChangesCommand { get { return MyCustomCommand(_somethingToExecute, e=>true); }

Mock 有什么方法可以让我真正调用 ApplyChangesCommand 的 _somethingToExecute?Callbase 没有削减它,我想不出任何其他方法来做到这一点。

一种解决方法是公开“_somethingToExecute”并在我的测试中创建 ApplyChangesCommand,但我不是粉丝。

任何建议表示赞赏。

谢谢

4

1 回答 1

1

好的,现在我有更多的时间来看看这不是在工作中匆忙,我看到了这个问题。您应该做的是使用注入的工厂来创建ApplyChangesCommand. 然后,为了对您的 VM 进行单元测试,您只需验证该命令是否返回工厂创建的命令。下面是一个例子:

public class MyViewModel
{
    private MyCustomCommandFactory _commandFactory;
    private void _somethingToExecute;

    public MyViewModel(MyCustomCommandFactory commandFactory)
    {
        _commandFactory = commandFactory;
    }

    public ICommand ApplyChangesCommand  
    { 
        get 
        { 
            return _commandFactory.Create(_somethingToExecute, e=>true);
        }
    }
}

这假设您希望每次调用 get 时都创建一个新命令(这似乎是您设置它的方式)。如果您只想为 VM 的生命周期创建一个命令,显然您可以通过 VM 构造函数中的工厂创建命令。

要对此进行单元测试,您可以执行以下操作:

[Test]
public void ApplyChangesCommand_Always_ReturnsFactoryCreatedCommand
{
    Mock<ICommand> mockCreatedCustomCommand = new Mock<ICommand>();
    Mock<MyCustomCommandFactory> mockCommandFactory = new Mock<MyCustomCommandFactory>();
    mockCreatedCustomCommand.Setup(p => p.Create(It.IsAny<Action>(), e => true))
                            .Returns(mockCreatedCustomCommand.Object);
    Assert.That(systemUnderTest.ApplyChangesCommand, Is.SameAs(mockCreatedCustomCommand.Object));
}

(改变Action你的代表实际上是什么)。

这就是你应该对 VM 的命令进行单元测试的全部内容。如果您想测试行为是否符合您的预期(意思是,它执行传入的委托并使用该委托返回预期值),那么这就是验收测试的领域。

注意:我在测试示例中使用了 Moq 模拟框架语法。

就个人而言,我不会将这样的代表传递给Command. 相反,我会注入任何Command需要的东西,并将所有逻辑都放在Command.

于 2013-08-13T01:08:30.627 回答