我很嘲笑,所以这可能是我还没有接受的东西,但我找不到任何好的例子。
我试图断言默认情况下,从我的抽象类继承的任何类都将在构造函数中实例化一个集合。这是抽象类:
public abstract class DataCollectionWorkflow : SequentialWorkflowActivity
{
private readonly DataSet _output = new DataSet();
private List<DataCollectionParameter> _params = null;
public DataCollectionWorkflow()
{
_params = new List<DataCollectionParameter>();
}
public virtual IList<DataCollectionParameter> Parameters
{
get { return _params; }
set { _params = (List<DataCollectionParameter>)value; }
}
}
我如何用Rhino嘲笑这个?如果我执行GenerateMock<DataCollectionWorkflow>
(或存根),构造函数运行并且模拟的私有字段“_params
”被初始化,但模拟的“Parameters
”属性只是空。
显然,生成的模拟子类正在覆盖属性实现。是否有某种方法可以将Parameters属性排除在重新实现之外?
感谢。
答案 0 :(得分:5)
好的,我明白了。把我当作犀牛错综复杂的另一个牺牲品。这种事情让我想要转向一个更简单的框架,也许我会查看MoQ。
所以答案是使用PartialMocks。我曾经简单地玩过生成部分模拟,但是当我在它上面运行调试器时,我注意到属性甚至都不是null,它们抛出了奇怪的异常,所以我看起来并不那么深。我使用的是短格式AAA语法。
如果我简单地将模拟放入播放模式,则测试工作 - 属性按原样使用(因为它们应该与部分模拟一起使用)。
所以这就是答案:
[Test]
public void ShouldCreateParameterListInConstructor()
{
var mockRepository = new MockRepository();
var mock = mockRepository.PartialMock<DataCollectionWorkflow>();
using ( mockRepository.Record() )
{
}
using (mockRepository.Playback())
{
Assert.That(mock.Parameters, Is.Not.Null, "DataCollectionWorkflow base class didn't create new param collection");
}
}
我意识到这是一个有状态的测试,但它实际上是涉及相关属性的一些行为测试的更简单的前奏,所以我希望这个案例作为先决条件。希望它可以帮到某人。
答案 1 :(得分:0)
尝试制作_params virtual