【问题标题】:How to check property changed signalled with FluentAssertions when internally raised for all properties?在为所有属性内部引发时,如何检查使用 FluentAssertions 发出的属性更改信号?
【发布时间】:2017-10-06 06:03:38
【问题描述】:

我正在使用 FluentAssertions 检查视图模型。我想验证是否为属性正确引发 PropertyChanged 事件。

这在单个属性信号时工作正常:

public string MyName {
  get => this.myName;
  set => {
    this.myName = value;
    this.FirePropertyChanged(nameof(this.MyName));
  }
}
...
sut.MonitorEvents();
sut.ShouldRaisePropertyChangeFor(model => model.MyName); // OK

一些复杂的视图模型想要刷新所有属性并引发 nullstring.Empty 导致视图刷新 (MSDN)。 但是 FluentAssertions 调用不接受这是有效的更改。

public string IsServer {
  get => this.isServer;
  set => {
    this.isServer = value;
    this.FirePropertyChanged(string.Empty);
  }
}
...
sut.MonitorEvents();
sut.ShouldRaisePropertyChangeFor(model => model.IsServer); // FAILED

有没有办法检查这样的事件?

【问题讨论】:

    标签: c# unit-testing inotifypropertychanged fluent-assertions


    【解决方案1】:

    ShouldRaisePropertyChangeFor 需要一个表达式,该表达式虽然适用于 null,但不适用于空字符串。仍然可以使用ShouldRaise 来检查PropertyChanged 事件是否由特定的PropertyChangedEventArgs 引发。

    给定

    public string IsServer {
      get => this.isServer;
      set => {
        this.isServer = value;
        this.FirePropertyChanged(string.Empty);
      }
    }
    

    通过以下测试

    //Arrange
    var sut = new Sut();
    
    sut.MonitorEvents();
    
    //Act
    sut.IsServer = "Hello World";
    
    //Assert
    sut.ShouldRaise("PropertyChanged")
        .WithArgs<PropertyChangedEventArgs>(e => e.PropertyName == string.Empty);
    

    ShouldRaise(...).WithArgs&lt;&gt;(...)应该满足测试要求

    上面可以封装成自己的扩展方法,建立在最初的想法上。

    public static class AllPropertiesChangedSourceExtensions {
        private const string PropertyChangedEventName = "PropertyChanged";
        public static FluentAssertions.Events.IEventRecorder ShouldRaisePropertyChangeFor<T>(this T eventSource, string propertyName) {
            return eventSource.ShouldRaise(PropertyChangedEventName)
                .WithSender(eventSource)
                .WithArgs<PropertyChangedEventArgs>(args => args.PropertyName == propertyName);
        }
    }
    

    又叫

    //Assert
    sut.ShouldRaisePropertyChangeFor(string.Empty); //Or null depending on which was used
    

    顺便说一句,当使用string.Emptynull 调用该事件时,实际上并没有调用引发的所有属性。侦听获取这些值的事件的框架将根据将 null 或空字符串作为属性名称引发的事实通知 UI。

    【讨论】:

    • 感谢您的回复,但它并没有真正回答我的问题。也许它没有完全描述。从用户的角度来看,我想验证单个“PropertyChanged”的提升,即使实现提升与string.empty。 PropertyChanged 的​​种类与视图无关,因此它应该与测试相关。
    【解决方案2】:

    应该(没有双关语)可以致电sut.ShouldRaisePropertyChangeFor(null)

    【讨论】:

    • null 有效,但不适用于string.Empty。为该边缘情况创建了一个额外的扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多