wtorek, 26 czerwca 2012

Testy jednostkowe dla Expression

Pisałem test dla wyrażeń lambda i to co mnie zaskoczyło to test, który nie przechodził dla zmiennych typu epression.
[Test]
public void TestExpressionPlusOne()
{
    Expression<Func<int, int>> increase1 = x => x + 1;
    Expression<Func<int, int>> increase2 = x => x + 1;

    Assert.AreEqual(increase1 , increase2 );
}
Test nie przechodził, gdyż zmienne do porównania są anonimowymi delegatami. Należało skompilować wyrażenie, gdyż CLR próbuję w locie stworzyć nową klasę. Wtedy uzyskałem do porównania dwa skompilowane wyrażenia. Podając argumenty mogłem dostać wartości dla których można porównywać te wyrażenia. Dla łatwiejszej implementacji wykorzystałem atrybut Values, który wypełniał parametr w funkcji.
[Test]
public void TestExpressionPlusOne( 
    [Values(-99,-9,-1,0,1,9,99)] int values)
{
    Expression<Func<int, int>> increase1 = x => x + 1;
    Expression<Func<int, int>> increase2 = x => x + 1;

    Func<Expression<Func<int, int>>, int> 
compileAndInvoke = expression => expression
                                .Compile()
                                .Invoke(values);
 
    Assert.AreEqual(compileAndInvoke (increase1 ), 
                    compileAndInvoke (increase2 ));
 
}
W taki sposób utworzyło się 7 testów dla różnych argumentów wyrażenia.


Brak komentarzy:

Prześlij komentarz