gpt4 book ai didi

c# - 使用 Microsoft Fakes 进行模拟

转载 作者:行者123 更新时间:2023-11-30 13:26:49 24 4
gpt4 key购买 nike

我有需要模拟的带有 async(.net 4.5) 方法的密封类。我使用的是 Microsoft Fakes,因此它们将是“垫片”。以下代码是我需要做的示例。它构建但是当运行并且调用“登录” Controller 方法中的“LoginAsync”方法时,测试挂起。

  [TestMethod]
public async Task LoginPost_Returns() {

using (ShimsContext.Create()) {
var c = new TestController();
var user=new User();

Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um, u) => new Task<IUser>(() => { return user; });

//call controller method
var result = await c.Login(model, returnUrl) as ViewResult;
var expectedViewName = "Index";
Assert.IsNotNull(result);
Assert.AreEqual(expectedViewName, result.ViewName);
}

//Controller method
public async Task<ActionResult> Login(LoginModel model, string returnUrl) {
var user = await UserManager.LoginAsync(model.UserName, model.password);
return View();
}

最佳答案

不要在async 代码中使用Task 构造函数。如果您只需要一个已完成的带有返回值的 Task,请使用 Task.FromResult:

IUser user = new User();
Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um, u) => Task.FromResult(user);

作为额外的提示,最好在单元测试中涵盖这些情况:

  • 同步成功(Task.FromResult(user))。
  • 异步成功(Task.Run(() => user))。
  • 异步错误(Task.Run(() => { throw new InvalidOperationException("or whatever"); return user; }))。

关于c# - 使用 Microsoft Fakes 进行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com