Дженкинс провалил недетерминированные методы теста CanExecute - PullRequest
13 голосов
/ 04 июня 2019

У нас есть много тестов 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)

проблема в том, что это происходит только с Дженкинсом, и это очень недетерминировано.

РЕДАКТИРОВАТЬ:

Хорошо, еще одна вещь, о которой нужно подумать.Свойство 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 голосов
/ 12 июня 2019

Пахнет для меня проблемой сбора мусора. Я не вижу ничего, что выскочило на меня в вашем примере, хотя пример кода неполон (где вызывается RegisterCommands?), Поэтому может быть упущено что-то важное.

См. Источник для RelayCommand.CanExecute(). Требуется слабая ссылка на действие, которое вы проходите, и как только это действие будет собрано, CanExecute вернет false. Смотрите мой ответ здесь для примера такого случая.

Я повторяю комментарий @ Nkosi, создайте минимальный пример, а не показывайте нам кусочки.

...