[英]Jenkins failed unit CanExecute test's methods nondeterministic
我們在項目中對各種命令進行了很多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的評論,創造一個最小的例子而不是向我們展示點點滴滴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.