いくつかのデフォルトの実装を提供する基本クラスがありますINotifyPropertyChanged
(このクラスは他の多くのクラスで使用され、簡単に変更することはできません)。
public class ObservableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// this is virtual so derived classes can override it (rarely used, but it is used)
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
これで、インターフェイスと、そのインターフェイスから派生しObservableBase
て実装する抽象基本クラスができ、いくつかのデフォルトの実装 (主にプロパティ用) が提供されます。
public interface INamedTrigger
{
string Name { get; }
void Execute();
}
public abstract class ObservableNamedTriggerBase : ObservableBase, INamedTrigger
{
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; OnPropertyChanged("Name"); }
}
public abstract void Execute();
}
ObservableNamedTriggerBase
ここで、 (NUnit と RhinoMocks を使用して)の既定の実装を単体テストしたいと思います。
[TestFixture]
public class ObservableNamedTriggerBaseTest
{
[Test]
public void TestNameChangeRaisesPropertyChanged()
{
var prop = "";
var mocks = new MockRepository();
var namedBase = mocks.PartialMock<ObservableNamedTriggerBase>();
namedBase.PropertyChanged += (s, e) => prop = e.PropertyName;
namedBase.Name = "Foo";
Assert.AreEqual("Name", prop);
}
}
OnPropertyChanged
残念ながら、Rhino がからの仮想メソッドをオーバーライドしているように見えるため、このテストは失敗しますObservableBase
。
This SO questionとRhino docsPartialMock
は、これを行うべきではないことを示しています。一方、このSO の質問に対する回答は、Rhino がモックの種類に関係なく常に仮想メソッドをオーバーライドすることを示しています。
では、ドキュメントは間違っていますか?そして、これを正しくテストするにはどうすればよいですか?
更新: 抽象メソッドだけのダミー実装を提供する独自のモック クラスを作成すると、テストはパスしますが、Rhino モックを使用して、正確にそれを行う作業を節約したいと思います。