【发布时间】:2020-03-16 07:13:05
【问题描述】:
我正在尝试迁移一个 asp.net mvc 5 控制器以使用 async/await。我在测试是否设置了正确的文化时遇到了问题。
在旧(非异步)版本的代码中,单元测试通过,因为一切都在同一个线程上运行。在新(异步)版本的代码中,单元测试失败,因为在调用 async/await 方法后未维护当前区域性。
在新版本的代码中,文化设置正确,视图有正确的文化设置。唯一的问题是我无法在我的 NUnit 测试中对此进行测试,因为它在 await 调用之外。
你知道我该如何解决这个问题吗?我在下面使用的代码提供了一个类似伪代码的版本。
旧代码:
public ActionResult Index()
{
// Look up user in database
var dbUser = database.GetUser(User.Identity.GetUserId());
// Set preferred culture
Thread.CurrentThread.CurrentCulture = new CultureInfo(dbUser.PreferredCulture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(dbUser.PreferredCulture);
// Do some other work
DoSynchronousWork();
return View();
}
[TestFixture]
public class TestClass
{
[Test]
public void TestIndex_CorrectCulture()
{
// Mock database
database.GetUser().Returns(new User(){PreferredCulture = "de"});
// Call controller
_controller.Index();
// Check that the thread culture was correctly set - this passes
Assert.AreEqual("de", Thread.CurrentThread.CurrentCulture);
Assert.AreEqual("de", Thread.CurrentThread.CurrentUICulture);
}
}
新代码:
public async Task<ActionResult> Index()
{
// Look up user in database
var dbUser = database.GetUser(User.Identity.GetUserId());
// Set preferred culture
Thread.CurrentThread.CurrentCulture = new CultureInfo(dbUser.PreferredCulture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(dbUser.PreferredCulture);
// Do some other work
await DoAsynchronousWork();
return View();
}
[TestFixture]
public class TestClass
{
[Test]
public async Task TestIndex_CorrectCulture()
{
// Mock database
database.GetUser().Returns(new User(){PreferredCulture = "de"});
// Call controller
await _controller.Index();
// Check that the thread culture was correctly set - this fails because the culture inside _controller.Index() is lost after the await call
Assert.AreEqual("de", Thread.CurrentThread.CurrentCulture);
Assert.AreEqual("de", Thread.CurrentThread.CurrentUICulture);
}
}
【问题讨论】:
-
在我看来,测试这一点的最简单方法是在视图中包含与文化相关的内容。这样,您的测试就是测试是否返回了正确的视图(行为),而不是设置了线程的文化(实现)。
标签: c# asp.net-mvc nunit cultureinfo