(с C # 3.0 и VS 2008).
При работе с MVVM WPF вы часто пишете такие свойства:
public bool MyProperty {
get{return _myProperty;}
set{
if(_myProperty == value)return;
_myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
При выполнении TDD я часто заканчиваю писать такие тесты, как:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
(s,e)=>{eventRaised = true;propName = e.PropertyName;};
Assert.That(mySUT.MyProperty,Is.False(),"mySUT.MyProperty");
mySUT.MyProperty = true;
Assert.That(eventRaised,"eventRaised");
Assert.That(propName, Is.EqualTo("MyProperty"),"propName");
// could check not raised when set same...
}
Я экспериментировал с таким методом:
public class MyTestMethods{
public static PropertyChangedEventHandler MakePropertyChangedHandler(
bool eventWasRaised, string propertyName){
return (s,e)=>{eventWasRaised = true; propertyName = e.PropertyName};
}
}
Чтобы я мог написать свой тест:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
MyTestMethods.MakePropertyChangedHandler(eventRaised,propName);
// etc...
}
Но VS2008 сказал мне, что eventRaised всегда будетбыть ложным.
Я подумал, что, возможно, изменение MakePropertyChangedHandler для использования параметров ref сработает
public static PropertyChangedEventHandler MakePropertyChangedHandler(
ref bool eventWasRaised, ref string propertyName){
return // lambda...
}
, но VisualStudio говорит мне «Невозможно использовать параметр ref или out« x »внутри тела анонимного метода».
Может кто-нибудь сказать мне, если можно написать рабочий метод, как MakePropertyChangedHandler, и если нет, то почему?