0

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

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

字符串 DoSomething1(字符串);

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

//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;
    }

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

谢谢

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

4

1 回答 1

0

我无法弄清楚这一点,但通过为我的所有测试类创建一个基类来解决它,并在这个基类中放入一个方法,该方法根据输入返回正确的东西。

然后,在测试本身中,我没有使用 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 );

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

于 2011-02-09T18:35:22.697 回答