Unit testing 带有IStringLocalizer的asp.net核心测试控制器
我有一个本地化控制器Unit testing 带有IStringLocalizer的asp.net核心测试控制器,unit-testing,asp.net-core,.net-core,localization,xunit,Unit Testing,Asp.net Core,.net Core,Localization,Xunit,我有一个本地化控制器 公共类HomeController:控制器 { 专用只读IStringLocalizer\u localizer; 公共家庭控制器(IStringLocalizer) { _定位器=定位器; } [HttpPost] 公共IActionResult集语言(字符串区域性、字符串返回URL) { Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookiierRequestCult
公共类HomeController:控制器
{
专用只读IStringLocalizer\u localizer;
公共家庭控制器(IStringLocalizer)
{
_定位器=定位器;
}
[HttpPost]
公共IActionResult集语言(字符串区域性、字符串返回URL)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookiierRequestCultureProvider.MakeCookieValue(新请求文化(文化)),
新CookieOptions{Expires=DateTimeOffset.UtcNow.AddYears(1)}
);
返回LocalRedirect(returnUrl);
}
公共IActionResult索引()
{
ViewData[“MyTitle”]=\u定位器[“你好,我亲爱的朋友!”;
返回视图(“索引”);
}
}
我添加了用于测试的xUnit项目,并编写了下一个代码
公共类HomeControllerTest
{
专用只读IStringLocalizer\u localizer;
私人家庭控制器(u控制器),;
私有视图结果_结果;
公共家庭控制器测试()
{
_控制器=新的HomeController(_定位器);
_结果=_controller.Index()作为ViewResult;
}
[事实]
public void IndexViewDataMessage()
{
//断言
Assert.Equal(“你好,我亲爱的朋友!”,_result?.ViewData[“MyTitle”]);
}
[事实]
public void IndexViewResultNotNull()
{
//断言
Assert.NotNull(_result);
}
[事实]
public void IndexViewNameEqualIndex()
{
//断言
Assert.Equal(“索引”、_result?.ViewName);
}
}
当我运行所有测试时,它们返回false,异常:消息:System.NullReferenceException:对象引用未设置为 对象的实例 双击StackTrace中的某个方法时,光标将显示在该行上
ViewData[“MyTitle”]=\u定位器[“你好,我亲爱的朋友!”;
我认为这是由于IStringLocalizer。如何修复它?可能有人知道原因是什么?设置模拟以返回预期结果
var mock = new Mock<IStringLocalizer<HomeController>>();
string key = "Hello my dear friend!";
var localizedString = new LocalizedString(key, key);
mock.Setup(_ => _[key]).Returns(localizedString);
_localizer = mock.Object;
_controller = new HomeController(_localizer);
var mock=new mock();
string key=“你好,我亲爱的朋友!”;
var localizedString=新localizedString(键,键);
mock.Setup(=>[key])返回(localizedString);
_定位器=模拟对象;
_控制器=新的HomeController(_定位器);
如果在测试中需要实际本地化资源中的字符串,可以将Microsoft.AspNetCore.AllNuget包添加到测试项目中,然后使用以下代码:
var options = Options.Create(new LocalizationOptions {ResourcesPath = "Resources"});
var factory = new ResourceManagerStringLocalizerFactory(options, NullLoggerFactory.Instance);
var localizer = new StringLocalizer<HomeController>(factory);
var options=options.Create(新本地化选项{ResourcesPath=“Resources”});
var factory=new ResourceManagerStringLocalizerFactory(选项,NullLoggerFactory.Instance);
var定位器=新定位器(工厂);
ResourcesPath
应该是从项目根目录中找到HomeController.en.resx的相对路径。您在任何时候都不会为定位器赋值,因此它将为null
。您需要创建依赖项的模拟,并将其设置为返回testIs的预期值有没有可能为IStringLocalizer设置手动区域设置?我正在尝试测试一个调用IStringLocalizer的方法,我正在传递它的一个实例,但不知道如何设置语言环境。我尝试了\u myLocalizerVar.WithCulture(new CultureInfo(“fr”))
,但它创建了StringLocalizer的一个新实例,这不是我想要的。