Как проверить, что мой Func <T>вызывается в тестовом методе - PullRequest
1 голос
/ 14 января 2011

Мой универсальный класс принимает в конструкторе параметр Func , и я хочу протестировать один из его методов, который в основном вызывает параметр конструктора.
Я использую Moq и в моем тестовом коде что-то вроде этого:

[Fact]
public void Construct_EnsureInvokeFunction()
{
    _objectToTest=new TypeToTest<T>(It.IsAny<Func<T>>());
    _objectToTest.Construct();
    //here I want to ensure that the passed parameter is invoked
    //however since I can't mock Func<T>, I dont know how to verify 
    //whether Invoke method of Func<T> is triggered
}

Один из обходных путей, который я могу придумать, - это обернуть мой Func в новый интерфейс и создать метод для обертывания его метода Invoke, а затем использовать Moq для макета интерфейса. Однако это не кажется эффективным.

Я что-то упустил? Любая идея будет оценена.

Спасибо

Anton

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Вы можете обернуть Func<T> в анонимный метод, который устанавливает локальную переменную:

bool wasInvoked = false;
Func<T> testFunc = () => { var ret = funcToTest(); wasInvoked = true; return ret; }

// Test something with testFunc instead of funcToTest
...

Assert.IsTrue(wasInvoked);
2 голосов
/ 14 января 2011

Вы можете создать простое поддельное закрытие Func<T> с побочными эффектами и проверить эти побочные эффекты. Хорошим является увеличение локальной переменной, поскольку она также позволяет утверждать, что она не была вызвана больше, чем следовало бы. Как то так:

int counter = 0;
Func<T> f = () => { counter++; return fakeT; }
var objectToTest = new TypeToTest<T>(f);
objectToTest.Construct();
Assert.Equal(1, counter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...