【问题标题】:ResourceManager.GetString fails in unit testsResourceManager.GetString 在单元测试中失败
【发布时间】:2011-08-14 22:06:39
【问题描述】:

我创建了一个带有两个 resx 的程序集 MyResources:

  • MyResources.resx
  • MyResources.en.resx

在程序集中,我添加了一个处理程序类,其中包含一个 ResHandler 类中的 GetString 包装器:

    public string GetResString(string key)
    {            
        return _manager.GetString(key, _culture);
    }

_culture 只是一个可以从外部设置的属性:

    public void ChangeCulture(CultureInfo newCulture)
    {            
        _culture = newCulture;
    }

如果我从控制台应用程序调用此代码,一切正常:

    var res = ResHandler.GetInstance(Guid.NewGuid().ToString());
    //change the culture to "en"
    res.ChangeCulture(new CultureInfo("en"));
    Console.WriteLine(res.GetResString("TXT_0001"));

此代码将英文版本写入控制台。但是,如果我从单元测试方法调用完全相同的代码,则会出现 MyResources.resx 的内容。这里有什么问题?单元测试是否由于某种原因无法做到这一点?

【问题讨论】:

  • 没有。我的意思是它总是回退到单元测试模式下的 CurrentThread-Culture。 “消失”是什么意思:-)?
  • 您说“会出现 MyResources.resx 的内容”,但预期的是什么?顺便说一句,ResHandler.ChangeCUlture() 是如何实现的,它在哪里设置文化作为参数传递?
  • 好的,我编辑了帖子。 “出现”我要说的是,资源中的正确字符串被写入控制台。抱歉,有时我把德语翻译成英语有误;-)。
  • 您是否尝试在所有为_culture 赋值的地方设置断点?还在 _manager.GetString(key, _culture); 行上设置断点并查看可能传递了 null 值,因此在这种情况下,这可能会导致某种默认或意外行为
  • 是的,我已经这样做了。 ChangeUICulture 内部的分配是正确的。根本没有出现错误。请记住:如果从 Console-App 调用,一切正常,无需任何代码更改!

标签: c# unit-testing resources


【解决方案1】:

请注意,附属程序集存储在包含 EXE 的目录的子目录中。就像英语的“en-US”或“en”。问题是,您的测试在不同的 EXE 下运行,mstest.exe 而不是您的 app.exe。因此它将找不到卫星组件。我认为您可以通过在测试设置中使用部署来解决此问题,不确定。

【讨论】:

  • 我猜,这是正确的方法。谢谢你,但如果我配置在那里部署“en”文件夹,它不会被复制到 TestResults*\out-Folder。任何想法还需要什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2018-11-25
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
相关资源
最近更新 更多