詹金斯失败的单元CanExecute执行测试的方法不确定

时间:2019-06-04 12:31:12

标签: c# wpf jenkins moq canexecute

我们对项目中的各种命令执行了很多CanExecute测试。 当我们使用Visual Studio测试或AxoCover时,所有测试均正确通过。

我们尝试在执行“ CanExecute”之前添加一些先前的对象初始化,有时它可以工作(或者我们认为如此)。

testedViewModel.Object.InEditMode = inEditMode;

我有一个测试:

[TestCase(true, true, TestName = "Command_InEditMode_CanExecute")]
[TestCase(false, false, TestName = "Command_NotInEditMode_CannotExecute")]
public void CommandCanExecute(bool inEditMode, bool expectedResult)
{
    var testedViewModel =
        new Mock<SomeViewModel>(inEditMode)
        {
            CallBase = true
        };

    testedViewModel.Setup(x => x.InEditMode).Returns(inEditMode);

    Assert.AreEqual(expectedResult, testedViewModel.Object.Command.CanExecute(null));
}

有时(并非总是)詹金斯进行构建和运行单元测试时,一些可以执行的测试失败并显示以下消息:

MESSAGE:
  Expected: True
  But was:  False

+++++++++++++++++++  
STACK TRACE:
   at Project.CommandCanExecute(Boolean inEditMode, Boolean expectedResult)

问题是仅在詹金斯身上发生,而且不确定性很强。

编辑:

好,还需要考虑一件事。属性InEditMode放置在SomeModelView的基类中。

我在示例中为您合并了代码。

public BaseViewModel 
{
    public virtual bool InEditMode {get; set;}
}

public SomeViewModel : BaseViewModel
{
    public SomeViewModel () : base ()
    {

    }

    public ICommand Command { get; set; }

    public virtual void RegisterCommands()
    {
        Command = new RelayCommand(/*Do something*/, () => InEditMode);
    }
}

我们认为这可能是相关的,该对象认为在完成基类的初始化之前已将其初始化。但这很难用詹金斯来检查。

1 个答案:

答案 0 :(得分:0)

闻起来像是垃圾回收问题。尽管代码示例不完整(在何处调用了RegisterCommands,但您的示例中没有看到任何让我惊讶的东西,所以可能会丢失一些关键的信息。

请参阅RelayCommand.CanExecute()的来源。它对传递给您的操作的引用很少,一旦收集到该操作,CanExecute将返回false。有关此情况的示例,请参见我的答案here

我重申@Nkosi的评论,创建一个最小的示例,而不是向我们展示点点滴滴。