如何使用Rhino Mocks和MSpec在抽象类上测试虚拟属性?

时间:2011-07-13 16:03:46

标签: testing virtual rhino-mocks mspec

我在抽象类FirstName上有一个虚拟属性Foo。我需要测试虚拟属性的行为。该测试执行时,该方法永远不会触发(因此无论方法的主体是什么,测试总是失败)。如何将此方法作为我的测试系统?我该如何测试这种方法?

[Subject(typeof(Foo))]
public class When_whatever 
{
    Establish context = () => 
    {
        _fooSut = _mockRepository.PartialMock<Foo>(argumentOne, argumentTwo);
    };

    Because of = () => _result = _fooSut.FirstName;

    It should_return_not_null = () => _result.ShouldNotBeNull();

    private static string _result;
    private static Foo _fooSut;
}

我正在使用Rhino Mocks 3.5和mspec。

3 个答案:

答案 0 :(得分:0)

您是否尝试过PartialMock功能? See here

答案 1 :(得分:0)

我认为你应该在使用mock之前做_mockRepository.ReplayAll()。但在这种情况下,它应该只是执行。 BTW你想测试什么行为? 我不认为拥有抽象的公共财产是一个好的设计。你也可以发布你的Foo课程吗?

答案 2 :(得分:0)

如何构建部分模拟

您正在创建一个部分模拟,一个实现抽象类的模拟,并为类的虚拟和抽象部分提供模拟功能。

_fooSut = _mockRepository.PartialMock<Foo>(argumentOne, argumentTwo);

您正在调用您所说的虚拟FirstName

_result = _fooSut.FirstName;

但是,你没有存根虚拟呼叫,所以它返回默认值!在这种情况下,null。您需要将此调用添加到您的上下文中。

_fooSut.Stub(x => x.FirstName).Return("Lance");

如何测试行为

兰斯,我要鹦鹉the_joric的问题...... 你试图测试的行为是什么?您在上面编写的测试仅测试您可以设置模拟。

我只能开始猜测你是如何为这个摘要实现具体类的。那么,也许你想要做的是测试每个实现为这个属性提供一个非null值?在这种情况下,您可能希望使用behavior

[Behaviors]
public class ConcreteFoo
{
    It should_set_a_non_null_first_name = () => _fooSut.FirstName.ShouldNotBeNull();

    protected static Foo _fooSut;
}

Foo的每个实现都可以针对这些行为进行测试。

[Subject(typeof(DefaultFoo))]
public class When_using_a_default_foo
{
    Behaves_like<ConcreteFoo> a_concrete_impl_of_foo;

    protected static DefaultFoo _fooSut = new DefaultFoo();
}

[Subject(typeof(CustomFoo))]
public class When_using_a_custom_foo
{
    Behaves_like<ConcreteFoo> a_concrete_impl_of_foo;

    protected static CustomFoo _fooSut = new CustomFoo();
}