詹金斯失败单元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));
}

有时(并非总是)当 Jenkins 执行构建和运行单元测试时,某些可以执行测试失败并显示消息:

MESSAGE:
Expected: True
But was:  False
+++++++++++++++++++  
STACK TRACE:
at Project.CommandCanExecute(Boolean inEditMode, Boolean expectedResult)

问题是这只发生在 Jenkins 上,而且非常不确定。

编辑:

好的,还有一件事要考虑。属性 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);
}
}

我们认为这可以相关,该对象是在基类初始化完成之前初始化的思维。但这很难用 Jenkins 来检查。


溶液

我创建了一个属性类:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Assembly, AllowMultiple = true)]
public class GarbageCollectorDisabler : Attribute, ITestAction
{
public void BeforeTest(ITest test)
{
GC.TryStartNoGCRegion(2048 * 4096);
}
public void AfterTest(ITest test)
{
GC.EndNoGCRegion();
}
public ActionTargets Targets => ActionTargets.Test;
}

然后我可以为每个"CanExecute"测试使用此属性:

[GarbageCollectorDisabler]
[TestCase(TestName = "SomeTest_InEditMode_CanExecute")]
public void SomeTestCanExecute()
{}

对我来说闻起来像垃圾收集问题。在您的示例中,我没有看到任何跳出我的东西,尽管代码示例不完整(RegisterCommands在哪里调用?),因此可能会缺少一些关键的东西。

请参阅RelayCommand.CanExecute()源。 它需要对您传入的操作进行弱引用,一旦收集了该操作CanExecute将返回false。有关这种情况发生的示例,请参阅我的答案。

我重申@Nkosi的评论,创建一个最小的例子,而不是向我们展示零碎的东西。

相关内容

  • 没有找到相关文章

最新更新