Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 带有IStringLocalizer的asp.net核心测试控制器_Unit Testing_Asp.net Core_.net Core_Localization_Xunit - Fatal编程技术网

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的一个新实例,这不是我想要的。