你是如何生活在App_GlobalResource中的Moq ares?

mar*_*rdy 9 .net unit-testing moq app-globalresources asp.net-mvc-3

我正在为MVC3 Web项目中的控制器编写单元测试,但是当我们尝试访问这样的资源时,我的测试会抛出异常:

return Index(Resources.Strings.MyStringResource);
Run Code Online (Sandbox Code Playgroud)

该资源是一个.resx标题为的文件Strings.

我正在使用Moq库来实现HttpContextBase功能的单元测试,所以我想知道如何使用Moq库来访问App_GlobalResource.

任何帮助或指针将不胜感激!

cas*_*One 5

你不能,至少不是直接的.从资源(.resx)文件生成的强类型类会公开静态方法,而不是实例方法.

因此,它们不能实现接口方法,也不是虚拟的; Moq要求至少满足其中一个条件才能创建模拟.

要解决这个问题,你可以像其他任何东西一样创建一个抽象:

public interface IResources
{
    string MyStringResource { get; }
}
Run Code Online (Sandbox Code Playgroud)

您将此实现传递(或注入)到您的控制器,然后将其传递给您的Index方法.该实现可能看起来像这样:

public class ResourcesWrapper : IResources
{
    public string MyStringResource 
    { 
        get 
        { 
            return Resources.Strings.MyStringResource; 
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您进行测试时,您可以使用Moq创建IResources接口的模拟,并将其传递给您的控制器,如下所示:

// Create the mock.
var mock = new Mock<IResources>();

// Setup the property.
mock.SetupProperty(m => m.MyStringResource, "My Mocked Value");

// Pass the object somewhere for use.
Assert.AreEqual(mock.Object.MyStringResource, "My Mocked Value");
Run Code Online (Sandbox Code Playgroud)