【问题标题】:Mock async static method with Moq使用 Moq 模拟异步静态方法
【发布时间】:2018-05-14 10:11:20
【问题描述】:

到目前为止,我已经能够通过将其签名更改为(伪)之类的东西来模拟静态方法

public static Func<TResult> Foo = () => { return TResult; };

然后在测试中我可以通过

模拟它
MyClass.Foo = () => new TResult();

我现在面临一个新问题。

有一个带有类似签名的方法:

public static async Task<TResult> FooBar(string obj1, string obj2)

我已经改成

public static Func<string, string, Task<TResult>> FooBar = async (obj1, obj2)

这编译得很好,但我没有让它为测试而编译。

MyClass.FooBar(It.IsAny<string>(), It.IsAny<string>()) => Task.FromResult(new TResult());

我知道我应该将 await 放在整个通话中的某个位置,但它就是不会让步。 现在嘲笑这个代表的正确方法应该是什么?

【问题讨论】:

  • 模拟静态方法是通往地狱世界的大门。如果您正在进行单元测试,请正确使用依赖注入。根本不要使用静态方法,因为它们定义了静态依赖项。如果必须,请使用 HttpContextWrapper 之类的包装类。

标签: c# asynchronous moq static-methods


【解决方案1】:

这对你有用吗?

MyClass.FooBar = (string obj1, string obj2) => Task.FromResult(new TResult());

注意:不确定您的 TResult 来自哪里,但由于在 C# 中不可能有泛型函数的实例,因此您的 TResult 在编写模拟时必须是“已知的”,即

public static Func<string, string, Task<int>> Foo = Bar<int>;            
public static async Task<TResult> Bar<TResult>(string obj1, string obj2) where TResult : new()
    => await Task.FromResult(new TResult());

【讨论】:

  • 我的印象是我必须使用 It.IsAny() 作为您简单使用 (obj1, obj2) 的参数。成功了。
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 2014-01-18
  • 2012-09-16
  • 2010-11-12
  • 2017-04-23
  • 2015-02-13
  • 2019-05-22
  • 2014-08-30
相关资源
最近更新 更多