1

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。

4

3 回答 3

0

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

于 2011-07-14T10:09:15.320 回答
0

如何构建部分模拟

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

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

而且您正在调用您所说的属性virtualFirstName

_result = _fooSut.FirstName;

但是,您没有对虚拟调用进行存根,因此它返回了默认值!在这种情况下,null。您需要将此调用添加到您的上下文中。

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

如何测试行为

兰斯,我要模仿 the_joric的问题……您要测试的行为是什么?您在上面编写的测试只是测试您可以设置模拟。

我只能开始猜测您是如何为这个抽象实现具体类的。那么,也许您想要做的是测试每个实现是否为此属性提供了一个非空值?在这种情况下,您会想要使用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();
}
于 2011-07-26T21:17:35.307 回答
0

你试过PartialMock功能吗?看这里

于 2011-07-13T16:11:16.473 回答