【问题标题】:RhinoMocks generic creation of mocksRhinoMocks 的模拟创建泛型
【发布时间】:2011-02-07 22:45:10
【问题描述】:

我必须测试几个功能非常相似的不同类。

它们都注入了不同的接口,并且所有这些接口都有一个或多个具有此签名的方法:

字符串 DoSomething1(string);

很多被测试的类都会调用这些接口方法,我需要测试它们如何响应返回null、空字符串和抛出异常。 IE。如果只有一节课,我会做这个测试:

//arrange
        CarComponentType carNull = new CarComponentType();
        carNull.VendorCode = RESPONSE_NULL_CODE;

        CarComponentType carEmpty = new CarComponentType();
        carEmpty.VendorCode = RESPONSE_EMPTY_CODE;

        CarComponentType carEx = new CarComponentType();
        carEx.VendorCode = RESPONSE_EXCEPTION;

        ICarDBCorrector dbCar = MockRepository.GenerateMock<ICarDBCorrector>();
        dbCar
            .Stub(d => d.GetCarVendorByCode(RESPONSE_NULL_CODE))
            .Return(null);
        dbCar
            .Stub(d => d.GetCarVendorByCode(RESPONSE_EMPTY_CODE))
            .Return(String.Empty);
        dbCar
            .Stub(d => dbCar.GetCarVendorByCode(RESPONSE_EXCEPTION))
            .Throw(new Exception());


        CarComponentCorrector corrector = new CarComponentCorrector(dbCar);

        //act
        corrector.CorrectComponent(carNull);
        corrector.CorrectComponent(carEmpty);
        corrector.CorrectComponent(carEx);

        //assert
        Assert.AreEqual(RESPONSE_NULL_CODE, carNull.VendorName);
        Assert.AreEqual(RESPONSE_EMPTY_CODE, carEmpty.VendorName);
        Assert.AreEqual(RESPONSE_EXCEPTION, carEx.VendorName);

现在,我在 ICarDBCorrector 中还有 2 个这样的方法,我不想重复测试代码。

另外,我还有一些其他的 ComponentCorrector 类,它们使用类似的 IDbXXX 接口来完成它们的工作。

所以,我在考虑创建一些通用方法,它可以返回正确的存根模拟以供使用,但我不知道具体如何做到这一点。

即我想要类似的东西:

T PrepareNullEmptyThrowCorrector<T>(Action<T> action)
    {
        T mock = MockRepository.GenerateMock<T>();

        mock.Stub(with null).Return(null)
        ///etc.

        return mock;
    }

知道如何解决这个问题吗?

谢谢

更新:我找到了一些解决问题的方法。但为了得到更“科学”的答案,我更喜欢用通用方法的解决方案来回应,正如我最初打算的那样。只是好奇。我会将“已接受答案”标记从我的答案更改为任何其他标记,这提供了另一个有趣的解决方案。

【问题讨论】:

    标签: mocking rhino-mocks generics stub


    【解决方案1】:

    我无法解决这个问题,但通过为我的所有测试类创建一个基类来解决它,并在这个基类中放入一个方法,该方法根据输入返回正确的内容。

    然后,在测试本身中,我没有使用 Stub 来返回值,而是像这样使用 Do():

    基础测试类:

    protected string TestWithNullEmptyException(string code)
        {
            switch (code)
            {
                case REQ_NULL_CODE:
                    return null;
                    break;
                case REQ_EMPTY_CODE:
                    return String.Empty;
                    break;
                case REQ_EXCEPTION:
                    throw new Exception("Exception code recieved.");
                    break;
                default:
                    return "UNDEFINED";
                    break;
            }
        }
    

    在测试中:

    dbCar
         .Stub(d => d.GetAirVendorNameByCode(Arg<string>.Is.Anything))
         .Do( (Func<string, string>)TestWithNullEmptyException );
    

    那样,我在每个测试用例中唯一需要重复的就是“存根”,但无论如何我都必须这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多