Я изучаю юнит-тестирование с помощью googletest и не знаю, как выполнить функцию.
Короче говоря, мне нужно получить покрытие над лямбда-функцией (скажем, L), определенной внутри материнской функции M. M вызывает функцию C (определенную в другом файле), которая принимает в качестве аргумента лямбда-функцию L (обратный вызов). Я пишу модульный тест для M, и мне нужно вызвать M, высмеивая внешнюю функцию M, а также проверяя, что C смоделирована и L покрыта должным образом.
Короче говоря, объект-> M имеет L, а M вызывает C (L).
Есть ли способ в google test сделать это?
Общая форма того, что я уже пробовал:
/* source code */
/* header */
struct Object
{/*struct methods*/
//M declaration
int M();
};
/* cpp file */
int M()
{
/* some operations */
auto L = [](int number){/* operations, returns 0; */};
int store; //storing the result of C
store = C(L);
}
/* other file */
int C(int* L(int))
{
/* some operations */
L(1);
return some_int;
}
Код файла модульного теста:
#include <gmock/gmock.h>
#include <gtest.h>
using ::testing::Return;
using ::testing::ReturnRef;
using ::testing::DoAll;
using ::testing::SetArgReferee;
using ::testing::SetArgPointee;
using ::testing::SetArrayArgument;
using ::testing::_;
/* mock class*/
class MockedFunctions
{
public:
/* going to put 5 ints for the sake of the example */
MOCK_METHOD1(C, int(int));
};
class TestObject : public ::testing::Test
{
public:
TestObject(){}
~TestObject(){}
protected:
Object *objectInstance;
virtual void SetUp()
{ objectInstance = new Object;}
virtual void TearDown()
{ delete objectInstance;}
};
/* test for function */
TEST_F(TestObject, test_M)
{
MockedFunctions test_C;
EXPECT_CALL(test_C, C(_))
.Times(1)
/* don't care about passed number to L */
.WillOnce(DoALL (SetArgPointee<0>(L(3)), Return(0));
/* coud put EXPECT_EQ as well */
objectInstance->M();
}
Это дает мне ошибку в .WillOnce о том, что L не был объявлен в этой области.
Обратите внимание, что меня не волнует содержимое L, если оно покрыто. То, что я нашел до сих пор по этой теме, предложило смоделировать мою лямбда-функцию L, которую я не хочу здесь делать, поскольку мне нужно охватить ее код как часть функции M.
Хотя от меня не требуется, в этом случае строго использовать стиль GTest (поскольку мой преподаватель не знал, как поступить с этим покрытием функций L), и мог бы использовать заглушку для C, которая вынудила бы использовать L ( У меня есть эта версия, реализованная в настоящее время, чтобы иметь возможность компилировать с остальным кодом), возможно ли, тем не менее, получить это покрытие, используя строго стиль googletest?
Спасибо!