Модульный тест IBackgroundJobClient.Schedule - PullRequest
0 голосов
/ 10 апреля 2019

Я использую Hangfire для планирования некоторых работ. У всех моих заданий есть дата расписания, поэтому я использую метод статического расширения Schedule

public static string Schedule([NotNull] this IBackgroundJobClient client, [InstantHandle][NotNull] Expression<Action> methodCall, DateTimeOffset enqueueAt);

Я хочу провести модульное тестирование своих методов, чтобы проверить, действительно ли запущен Hangfire.

Для этого я следовал документации Hangfire по модульному тестированию (https://docs.hangfire.io/en/latest/background-methods/writing-unit-tests.html), в которой предлагается издеваться IBackgroundJobClient и проверять единственный открытый метод Create, который у него есть:

string Create([NotNull] Job job, [NotNull] IState state);

Но я вижу, что для вызовов по расписанию это не вызывается, вместо этого вызывается другая, не общедоступная перегрузка, поэтому я получаю следующую ошибку:

Message: Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: x => x.Create(It.IsAny<job>(), It.IsAny<enqueuedstate>())
No setups configured.

Performed invocations: 
IBackgroundJobClient.Create(JobService.TaskFunction, ScheduledState)

Тем не менее, я предпринял попытку с помощью метода Enqueue, и это похоже на работу с макетом. Но мне нужно использовать Schedule.

Другим вариантом будет утверждение о перегрузке, которую он на самом деле вызывает

public static string Create([NotNull] this IBackgroundJobClient client, [InstantHandle][NotNull] Expression<Action> methodCall, [NotNull] IState state);

Но так как это метод расширения, это недопустимый подход для Moq.

Message: System.NotSupportedException : Invalid verify on an extension method: x => x.Create(It.IsAny<Expression<Action>>(), It.IsAny<EnqueuedState>())

Так как я могу провести модульное тестирование Hangfire для метода Schedule?

1 Ответ

2 голосов
/ 10 апреля 2019

В приведенном вами примере используется другой метод расширения, который в конце вызывает другой метод IBackgroundJobClient, github . Был вызван следующий метод:

client.Create(Expression<Action> methodCall, new EnqueuedState());

Он идеально соответствует Verify в примере.


С другой стороны, вы вызываете метод Schedule, github . Schedule метод в конце вызывает следующее:

client.Create(Expression<Action> methodCall, new ScheduledState(enqueueAt.UtcDateTime))

Это также метод выражения, поэтому вам нужно погрузиться еще глубже еще на один уровень, где был вызван действительный метод interface:

string Create([NotNull] Job job, [NotNull] IState state);

Как видно из самой ошибки, ваши ожидания не совпадают с фактическим вызовом:

Performed invocations: 
IBackgroundJobClient.Create(JobService.TaskFunction, ScheduledState)

Ваше утверждение должно быть примерно таким:

// Assert
client.Verify(x => x.Create(
    It.IsAny<Job>(), //you could as in example check actual method name
    It.IsAny<IState>()); //you could check actual offset
...