簡體   English   中英

Jenkins失敗單位CanExecute測試的方法不確定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM