1

我使用FluentAssertions来检查视图模型。我想验证是否正确地提升了属性的PropertyChanged事件。如何检查在为所有属性进行内部提升时使用FluentAssertions发送信号的属性更改?

信号单独的属性时,这是工作的罚款:

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 

有没有一个选项来检查这样的事件?

回答

0

应该(无双关语意)能够呼叫sut.ShouldRaisePropertyChangeFor(null)

+0

'null'有效,但不适用于'string.Empty'。为该边缘情况创建了额外的扩展程序。 – Nkosi

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<>(...)应满足测试

上面可以封装成的要求,是在原来的想法自己的扩展方法建设。

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事件称为实际上并不调用所有属性提高。侦听获取这些值的事件的框架将基于空或空字符串作为属性名称引发的事实来通知UI。

+0

感谢您的回复,但它并没有真正回答我的问题。也许它没有完全描述。从用户角度来看,我想验证个人“PropertyChanged”的提升,甚至用'string.empty'提升实现。这种PropertyChanged与视图无关,所以它应该与测试相关。 – LukasAIS

相关问题