单元测试 IBackgroundJobClient.Schedule
Unit test IBackgroundJobClient.Schedule
我正在使用 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
并验证它具有的唯一 public Create 方法:
string Create([NotNull] Job job, [NotNull] IState state);
但是我可以看到对于 Schedule 调用,它没有被调用,而是调用了另一个不是 public 的重载,所以我得到以下错误:
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);
但由于它是一种扩展方法,因此对于最小起订量来说这不是有效的方法。
Message: System.NotSupportedException : Invalid verify on an extension method: x => x.Create(It.IsAny<Expression<Action>>(), It.IsAny<EnqueuedState>())
那么如何为 Schedule
方法对 Hangfire 进行单元测试?
您引用的示例使用不同的扩展方法,最终调用不同的 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
我正在使用 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
并验证它具有的唯一 public Create 方法:
string Create([NotNull] Job job, [NotNull] IState state);
但是我可以看到对于 Schedule 调用,它没有被调用,而是调用了另一个不是 public 的重载,所以我得到以下错误:
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);
但由于它是一种扩展方法,因此对于最小起订量来说这不是有效的方法。
Message: System.NotSupportedException : Invalid verify on an extension method: x => x.Create(It.IsAny<Expression<Action>>(), It.IsAny<EnqueuedState>())
那么如何为 Schedule
方法对 Hangfire 进行单元测试?
您引用的示例使用不同的扩展方法,最终调用不同的 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