Problem z przekazaniem wartości do funkcji

0

Cześć, mam problem w następującej postaci, dla uproszczenia - mam funkcję o następującej definicji:

fun( )
{
    int x;
    if(x)
         {
         ...
         }
    else
         {
          ...
         }
}

Mam za zadanie napisać test działania funkcji, tak aby pokryć linie w if i w else. Chcę jednak, żeby zmienna x pozostała zmienną wewnętrzna funkcji, nie chcę jej przekazywać jako argument tylko na potrzeby wykonania testu. W jaki sposób mogę to zrobić?

0

w konstruktorze przekaz ta zmienna lub ja ustaw na dana wartosc.
W zaleznosci czym jest x mozna duzo rzeczy zrobic

0

Zmienna x jest zwykłym intem. Chciałbym, żeby wartość zmiennej x była ustawiana z poziomu funkcji testującej, która wchodzi do ciała testowanej funkcji.

1

Nie da się tak zrobić, a przynajmniej nie w przenośny i pewny sposób. Twoja zmienna istnieje tylko kiedy program wykonuje daną funkcje i siłą rzeczy nie można wpłynąć na jej wartość poza funkcja.
Ale zresztą taki test nie miałby w ogole sensu! Ja rozumiem że wartość zmiennej x w jakiś sposób wynika z parametrów funkcji fun, więc po prostu przekaż odpowiednie parametry.

0
kronos998 napisał(a):

Chcę jednak, żeby zmienna x pozostała zmienną wewnętrzna funkcji, nie chcę jej przekazywać jako argument tylko na potrzeby wykonania testu. W jaki sposób mogę to zrobić?

Bazując na Twoim uproszczonym kodzie - nie da się. Jednak mam wrażenie, że uprościłeś ją za bardzo przez co ciężko coś doradzić.

To co testujesz to zmiana wyjścia w zależności od Twojego wejścia, if else zależy od x ale wejściem funkcji jest to coś co ustawia x, może to być jakiś getter, albo np. stan obiektu? W obydwóch przypadkach wykonujesz odpowiednie mock'owanie obiektów/zmiennych od których zależy x. Niestety zgaduję tutaj, bo nic konkretniejszego nie można doradzić dopóki nie napiszesz od czego zależy x.

0

Nie chcę ustawiać wartości zmiennej na sztywno w funkcji. Jaki byłby najprostszy sposób na rozwiązanie tej kwestii?

0

Pokaż konkretnie co chcesz zrobić, bo twój przykład nie ma sensu.

0

Sprawa wygląda tak, że wartość zmiennej x jest ustawiana w innych funkcjach. Co mnie zdziwiło w funkcji którą chcę przetestować jest ona ustawiana sztywno na 0. A następne użycie zmiennej występuje już w ifie, tak że jej wartość nie zależy od parametrów.

0

skoro jest ustawiana w innych funkcjach to w takim razie klasa ma za duzo odpowiedzialnosci. Powinienes zrobic nowa klase ktora ustawia to X i w konstruktorze przekazac do tej starej klasy
Wtedy gdy masz interfejs mozesz to z mockowac i ustawic sobie wartosc X na jaka chcesz w tescie. Jezeli jest niejasne dla Ciebie. Zapewne nigdy tego nie robiles to moge napisac jakis przyklad

0

Będę wdzięczny :)

1

jest nawet prosciej niz myslalem (pisze w innym jezyku stad nie znam frameworkow do mockowania w C++), nie musisz zapewne zmieniac w ogole kodu

https://github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md
https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md

czyli mockujesz ta funkcje ktora ustawia to X i robisz tam swoje X na ile chcesz. Pozniej gdy wywolasz swoja funkcje X bedzie juz miala wartosc z mockowanej klasy

0

Dlaczego mock'ować zamiast po prostu wywołać funkcję, która ustawia x?

2

Pokaż więcej kontekstu tego kodu.
Jeśli to jest metoda, to więcej kodu całej klasy.
W C++ można mockować metody wirtualne oraz szablony. gmock jest najlepszy do tego celu.

Przykładowo używanie gtest i gmock (pisane z palca, więc mogłem coś pokręcić):

// kod produkcyjny
class IObserver
{
public:
     virtual int Fun();
};

class Foo
{
public:
    explicit Foo(IObserver *obs) : observer(obs);
    {}
    int testedFunction(int y)
    {
         int x = obsserver->Fun();
         if (x<0)
         {
             … …
         }
         else
         {
             … …
         }
    }
private:
    Observer *obsserver;
};

// kod testów
class MockObserver : public IObserver
{
public:
      MOCK_METHOD0(Fun, int());
};

TEST(FooTesting, testedFunctionTest)
{
     MockObserver observer;
     auto testObject = Foo { &observer };
     EXPECT_CALL(observer, Fun()).WillOnce(Return(12));
     EXPECT_EQ(12, testObject.testedFunction(22));
}
0

Reasumując wystarczy w teście utworzyć mocka obiektu danej klasy, a następnie ustawić EXPECTy?

1

Do tworzenia mocków jest tool, który robi to automatycznie.
https://github.com/cpp-testing/gmock.py
Podstawową umiejętnością w programowaniu jest szukanie i czytanie dokumentacji: https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md

Jak skonkretyzujesz problem to będziemy mogli pomóc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1