我们对项目中的各种命令执行了很多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);
}
}
我们认为这可能是相关的,该对象认为在完成基类的初始化之前已将其初始化。但这很难用詹金斯来检查。
答案 0 :(得分:0)
闻起来像是垃圾回收问题。尽管代码示例不完整(在何处调用了RegisterCommands
,但您的示例中没有看到任何让我惊讶的东西,所以可能会丢失一些关键的信息。
请参阅RelayCommand.CanExecute()
的来源。它对传递给您的操作的引用很少,一旦收集到该操作,CanExecute
将返回false
。有关此情况的示例,请参见我的答案here。
我重申@Nkosi的评论,创建一个最小的示例,而不是向我们展示点点滴滴。