Наблюдать ReactiveObject.Changed унаследованного класса может или не может работать - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь создать базовый класс, который наследуется от ReactiveObject. Этот класс должен проверить, изменилось ли какое-либо свойство, включая свойства дальнейшего наследования.

Моя главная проблема в том, что я не могу получить надежные результаты теста! Приведенный тест МОЖЕТ быть зеленым. Запуск его с VS Live Unit Testing, отображает его красным. Перемещение классов из тестового проекта в библиотеку может или не может сделать этот тест зеленым.

Пока что единственный способ сохранить его зеленым - это раскомментировать эту строку в унаследованном классе.

//  Changed.Subscribe(Console.WriteLine);
   [TestClass]
   public class StateBaseTests
   {
      #region Tests

      [TestMethod]
      public void State_ChangesToChanged_PropertyChanged()
      {
         var _item = new MyTest();

         _item.Surname = "Testname";

         Assert.AreEqual(Statetype.Changed, _item.State);
      }

      #endregion

      #region SubClasses

      public enum Statetype
      {
         Added,
         Changed,
         Deleted,
         Detached,
         Unchanged
      }

      public abstract class StateBase : ReactiveObject
      {
         protected StateBase()
         {
            State = Statetype.Unchanged;

            Changed.Select(prop => prop.PropertyName)
                   .Subscribe(UpdateZustand);
         }

         protected void UpdateZustand(string propertyName)
         {
            if(State == Statetype.Unchanged)
               State = Statetype.Changed;
         }

         [Reactive]
         public Statetype State { get; set; }
      }

      private class MyTest : StateBase
      {
         public MyTest()
         {
            //  Changed.Subscribe(Console.WriteLine);
         }

         [Reactive]
         public string Name { get; set; }

         [Reactive]
         public string Surname { get; set; }
      }
   }

1 Ответ

0 голосов
/ 14 октября 2019

Вот небольшая адаптация вашего образца. Сделал это используя VS Mac Community & NUnit. Тест действительно становится зеленым каждый раз на моей машине. Как видите, имя свойства также напечатано. На моей консоли выводит:

State
Surname

Вот код:

using System;
using System.Reactive.Linq;
using NUnit.Framework;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;

namespace Testy {
    [TestFixture]
    public class Test {
        [Test]
        public void State_ChangesToChanged_PropertyChanged() {
            var _item = new MyTest();
            _item.Surname = "Testname";
            Assert.AreEqual(Statetype.Changed, _item.State);
        }
    }

    public enum Statetype {
        Added,
        Changed,
        Deleted,
        Detached,
        Unchanged
    }

    public abstract class StateBase : ReactiveObject {
        protected StateBase() {
            State = Statetype.Unchanged;

            Changed
                .Select(prop => prop.PropertyName)
                .Subscribe(
                    name => {
                        UpdateZustand(name);
                        Console.WriteLine(name);
                    });
        }

        protected void UpdateZustand(string propertyName) {
            if (State == Statetype.Unchanged)
                State = Statetype.Changed;
        }

        [Reactive]
        public Statetype State { get; set; }
    }

    public class MyTest : StateBase {
        [Reactive]
        public string Name { get; set; }

        [Reactive]
        public string Surname { get; set; }
    }
}

Не уверен, что это помогает, но было интересно попробовать:).

PS: это используемые версии пакетов:

  • ReactiveUI (.Fody) 10.5.1
  • Nunit 3.12.0
  • NUnit3TestAdapter 3.15.1
...