需要访问数据层的单元测试HtmlHelper

时间:2009-10-29 15:23:27

标签: asp.net-mvc unit-testing mocking html-helper

我正在尝试为访问我的数据层以获取字符串的HtmlHelper创建单元测试。我看过很多帖子,我可能会遗漏一些东西。我遇到的问题是如何模拟对数据层的访问?我通常通过构造函数执行依赖注释,但我不能在这里因为html帮助器需要是静态的。所以我通过属性设置注入,但是如何从单元测试中访问它。对不起,如果这是显而易见的,但它现在搞砸了我。

这就是我所拥有的 -

public static class StringResourceHelper
{

    #region Private Members

    private static IStringResourceService _service;

    #endregion

    #region Public Properties

    private static IStringResourceService Service
    {
        get
        {
            if(_service==null)
            {
                _service = (IStringResourceService)Bootstrapper.Container.Resolve(typeof(IStringResourceService));
            }

            return _service;
        }
    }

    #endregion

    #region Public Methods

    public static string StringResource(this HtmlHelper helper, string label)
    {
        int languageCode;

        if(helper.ViewData["LanguageCode"] == null || !Int32.TryParse(helper.ViewData["LanguageCode"].ToString(), out languageCode))
        {
            languageCode = Constants.LanguageCodes.English;
        }

        return Service.GetString(label, languageCode);
    }

    #endregion

}

如何模拟Service.GetString调用?

2 个答案:

答案 0 :(得分:1)

免责声明我在Typemock工作

如果您需要模拟/伪造静态方法而不更改代码,则需要使用Isolator。 伪造方法使用:

完成
Isolate.WhenCalled(() => Service.GetString(string.empty, 0)).WillReturn(/*insert return value here*/);

如果要检查传递给Service.GetString的参数,请使用以下命令:

Isolate.Verify.WasCalledWithExactArguments(() => Service.GetString(/* use expected arguments*/);

答案 1 :(得分:0)

首先,我会厌倦任何需要成员变量的静态方法。对我而言,这表明你有一个对象(可能是Singletonly作用域)。所以我的第一个建议是将StringResourceHelper提升为非静态类并正常使用DI。

如果你不能,那么你选择的DI框架是否支持静态setter注入?如果我看到引导程序在DI框架外面播放的东西,警告铃声就会消失,因为它看起来好像是你正在使用DI框架作为服务定位器。

如果您无法将类更改为非静态且您的DI框架不支持静态setter注入,那么我会:

将DI框架设置为设置为返回模拟的测试的一部分,或者将一个setter添加到StringResourceHelper以便可以控制它。