Test metody zmieniającej rozkład elementów GUI

0

Witam,

szybkie pytanko czy mogę zrobić test dla void dla metody która wywołuje inną metodę. Ewentualnie co mogę sprawdzić dla poniższej metody

public void ChangeRowCol(int count)
{
    if (count == 1)
        AddWnd(panels, pnlLive, 1, 1);
    else                
    if (count == 2)
        AddWnd(panels, pnlLive, 1, 2);
    else
    if (count >= 3 && count <= 4)
        AddWnd(panels, pnlLive, 2, 2);
}

Z góry dziękuje za pomoc.

1

Nie powinieneś do tego podejść w kontekście testu tej pojedynczej metody, tylko tego co ma się dziać i za co ona jest odpowiedzialna.

Innymi słowy, co robi funkcja AddWnd?

0

<special for Riddle>jak bardzo chcesz i musisz to</special for Riddle> zmokuj AddWnd i sprawdzaj z jakimi parametrami jest wołana

0
abrakadaber napisał(a):

ewentualnie zmokuj AddWnd i sprawdzaj z jakimi parametrami jest wołana

No na pewno nie.

Nie wiem czy można dać gorszą radę początkującym programistom.

0

@Riddle: gdyż, ponieważ, bo? Było pytanie, jest odpowiedź na nie. Inną kwestią jest czy pytanie było do końca dobre.
BTW masz edita - może być?

1
abrakadaber napisał(a):

@Riddle: gdyż, ponieważ, bo? Było pytanie, jest odpowiedź na nie.

Bo to jest droga prosto do useless testów które nic nie testują. Nie tak się robi dobre testy.

3

Oszczędzasz klawiaturę?

Nie ma sensu testować tego w oparciu o mocka AddWnd, bo utrudnia to refactor, np. jeśli oczekiwany efekt może być do uzyskania bez wołania metody AddWnd w ogóle.

3

wkleję źródło bo chyba tak będzie najlepiej.
tesjed.jpg
1.png2.png3.png4.png

0
piniokp napisał(a):

Witam,

szybkie pytanko czy mogę zrobić test dla void dla metody która wywołuje inną metodę. Ewentualnie co mogę sprawdzić dla poniższej metody

public void ChangeRowCol(int count)
{
    if (count == 1)
        AddWnd(panels, pnlLive, 1, 1);
    else                
    if (count == 2)
        AddWnd(panels, pnlLive, 1, 2);
    else
    if (count >= 3 && count <= 4)
        AddWnd(panels, pnlLive, 2, 2);
}

Z góry dziękuje za pomoc.

Musisz pokazać więcej kodu żeby coś Ci się dało pomóc.

0
Riddle napisał(a):
piniokp napisał(a):

Witam,

szybkie pytanko czy mogę zrobić test dla void dla metody która wywołuje inną metodę. Ewentualnie co mogę sprawdzić dla poniższej metody

[....]

Z góry dziękuje za pomoc.

Musisz pokazać więcej kodu żeby coś Ci się dało pomóc.

Metoda AddWnd() poniżej

private void AddWnd(List<Window> wnds, Panel p, int col, int row)
{
    float t = 5;
    float x = 0, y = 0;
    float sizeX = 0;
    float sizeY = 0;
    float curentColumn = 0;
    float curentRow = 0;
    float selCol = -1;
    float selRow = -1;
    float curentX = 0;
    float curentY = 0;
    for (int i = 0; i < wnds.Count; i++)
    {
        curentColumn = i % col;
        curentRow = i / col;
        if (selRow == curentRow)
            x += t;
        else
        {
            x = 0;
            if (selCol >= curentColumn)
                y += t;
        }
        sizeX = (pnlLiveWidth - ((col * t) + t)) / col;
        sizeY = (pnlLiveHeight - ((row * t) + t)) / row;
        curentX = (x + curentColumn * sizeX) + t;
        curentY = (y + curentRow * sizeY) + t;
        selCol = curentColumn;
        selRow = curentRow;
        MethodInvoker methodInvokerDelegate = delegate ()
        {
            wnds[i].Size = new Size((int)sizeX, (int)sizeY);
            wnds[i].Location = new Point((int)curentX, (int)curentY);
        };
        if (wnds[i].InvokeRequired)
            wnds[i].Invoke(methodInvokerDelegate);
        else
            methodInvokerDelegate();
        
        if (!p.Controls.Contains(wnds[i]))
            p.Controls.Add(wnds[i]);
    }
}
0

Okej, to jeszcze pokaż gdzie jest wywoływana Twoja funkcja ChangeRowCol()?

0
piniokp napisał(a):

Witam,

szybkie pytanko czy mogę zrobić test dla void dla metody która wywołuje inną metodę.

Może ważniejszym pytaniem jest jak napisać kod który będzie łatwo testować? Metoda ChangeRowCol wykonuje dwie operację, oblicza ile będzie wierszy i kolumn oraz wprowadza zmiany. Obliczanie wywaliłbym do osobnej metody:

(int columnsCount, int rowsCount) CalculateRowsAndColumns(int count)
{
    if (count == 1)
        return (1, 1);
    else
    if (count == 2)
        return (1, 2);
    else
    if (count >= 3 && count <= 4)
        return (2, 2);
    else
        throw new Exception("...");
}

Taka metoda jest prosta do testowania.
Wywołanie też się upraszcza bo nie ma 4x AddWnd.

var rowsColumnCounts = CalculateRowsAndColumns(1);
AddWnd(panels, pnLive, rowsColumnCounts.columnsCount, rowsColumnCounts.rowsCount);

Metodę AddWnd też rozbiłbym na dwie osobne, jedną która wylicza, drugą która zatwierdza (Invoke itd.).

0

@Wilktar: To też nie jest dobre podejście do testowania.

Jak napiszesz test pod CalculateRowsAndColumns() to nie będziesz mógł jej potem zrefaktorowac bez zmiany testów. Tak powstają rigid testy (testy które failują bez powodu).

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