Как смешать TDD и RAII - PullRequest
       6

Как смешать TDD и RAII

1 голос
/ 16 июня 2010

Я пытаюсь сделать обширные тесты для моего нового проекта, но у меня есть проблема.

В основном я хочу протестировать MyClass. MyClass использует несколько других классов, которые мне не нужны / не хотят выполнять свою работу для целей теста. Поэтому я создал mocks (я использую gtest и gmock для тестирования)

Но MyClass создает все, что ему нужно, в своем конструкторе и освобождает его в деструкторе. Это RAII, я думаю.

Итак, я подумал, что мне следует создать какую-то фабрику, которая создает все и передает ее конструктору MyClass. Эта фабрика может иметь подделку для тестирования. Но разве это больше не RAII, верно?

Тогда какое здесь хорошее решение?

1 Ответ

2 голосов
/ 16 июня 2010

Ты издеваешься так же, как и над любым другим классом.Пусть конструктор класса RAII позаботится об этом.

class MyInterface
{
    virtual void MyApiFunction(int myArg)
    {
        ::MyApiFunction(myArg);
    }
};

class MyRAII : boost::noncopyable //Shouldn't be copying RAII classes, right?
{
    MyInterface *api;
public:
    MyRAII(MyInterface *method = new MyInterface)
    : api(method)
    {
        //Aquire resource
    }
    ~MyRAII()
    {
        //Release resource
        delete api;
    }
};

class MockInterface : public MyInterface
{
    MOCK_METHOD1(MyApiFunction, void(int));
};

TEST(Hello, Hello)
{
    std::auto_ptr<MockInterface> mock(new MockInterface);
    EXPECT_CALL(*mock, ....)...;
    MyRAII unitUnderTest(mock.release());
}
...