我们有一个提供一些默认实现的基类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);
}
}
不幸的是,这个测试失败了,因为 Rhino 似乎覆盖OnPropertyChanged
了ObservableBase
.
这个SO question和Rhino 文档表明不应该PartialMock
这样做。另一方面,这个SO question的答案表明,无论模拟类型如何,Rhino 总是覆盖虚拟方法。
那么文档有错吗?我该如何正确测试呢?
更新:如果我创建自己的模拟类,仅为抽象方法提供虚拟实现,则测试通过,但我想使用 Rhino 模拟来节省我做这件事的工作。