我有一个ASP.NET MVC核心应用程序,我正在为它编写单元测试。其中一种操作方法将用户名用于某些功能:
SettingsViewModel svm = _context.MySettings(User.Identity.Name);显然在单元测试中失败了。我环顾四周,所有的建议都是从.NET 4.5到模拟HttpContext。我相信有更好的方法。我试图注入IPrincipal,但是它抛出了一个错误;我甚至尝试过这样做(我想是出于绝望):
public IActionResult Index(IPrincipal principal = null) {
IPrincipal user = principal ?? User;
SettingsViewModel svm = _context.MySettings(user.Identity.Name);
return View(svm);
}但这也造成了一个错误。在文档里也找不到任何东西..。
发布于 2016-07-25 00:03:37
我希望实现抽象工厂模式。
为工厂创建一个接口,专门用于提供用户名。
然后提供具体的类,一个提供User.Identity.Name,另一个提供用于测试的其他硬编码值。
然后,您可以根据生产和测试代码使用适当的具体类。可能希望将工厂作为参数传递,或者根据某些配置值切换到正确的工厂。
interface IUserNameFactory
{
string BuildUserName();
}
class ProductionFactory : IUserNameFactory
{
public BuildUserName() { return User.Identity.Name; }
}
class MockFactory : IUserNameFactory
{
public BuildUserName() { return "James"; }
}
IUserNameFactory factory;
if(inProductionMode)
{
factory = new ProductionFactory();
}
else
{
factory = new MockFactory();
}
SettingsViewModel svm = _context.MySettings(factory.BuildUserName());https://stackoverflow.com/questions/38557942
复制相似问题