Unit testing 使用nunit对通用htmlHelper方法进行单元测试

Unit testing 使用nunit对通用htmlHelper方法进行单元测试,unit-testing,model-view-controller,nunit,html-helper,Unit Testing,Model View Controller,Nunit,Html Helper,我是nUnit的新手,我的任务是为一些htmlhelper扩展方法创建单元测试 我应该如何为以下方法创建单元测试 public static MvcHtmlString EnumDropDownListForOrderBy<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, bool orderById,

我是nUnit的新手,我的任务是为一些htmlhelper扩展方法创建单元测试

我应该如何为以下方法创建单元测试

    public static MvcHtmlString EnumDropDownListForOrderBy<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, bool orderById, string firstElement = null, object htmlAttributes = null)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

        Type enumType = GetNonNullableModelType(metadata);
        IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

        IEnumerable<SelectListItem> items = values.Select(value => new SelectListItem()
        {
            Text = value.GetAttributeFrom<DescriptionAttribute>(value.ToString()).Description,
            Value = value.ToString(),
            Selected = value.Equals(metadata.Model)
        });

        IEnumerable<SelectListItem> itemsFiltered = items.Where(e => !string.IsNullOrEmpty(e.Text)).AsEnumerable();

        itemsFiltered = itemsFiltered.OrderBy(e => (orderById ? e.Text : e.Value));

        return htmlHelper.DropDownListFor(
            expression,
            itemsFiltered,
            firstElement,
            htmlAttributes
        );
    }
public static MvcHtmlString EnumDropDownListForOrderBy(此HtmlHelper HtmlHelper,表达式,bool orderById,string firstElement=null,object htmlAttributes=null)
{
ModelMetadata元数据=ModelMetadata.FromLambdaExpression(表达式,htmlHelper.ViewData);
类型enumType=GetNonNullableModelType(元数据);
IEnumerable values=Enum.GetValues(enumType.Cast();
IEnumerable items=values.Select(value=>newselectListItem()
{
Text=value.GetAttributeFrom(value.ToString())。说明,
Value=Value.ToString(),
所选=value.Equals(metadata.Model)
});
IEnumerable itemsFiltered=items.Where(e=>!string.IsNullOrEmpty(e.Text)).AsEnumerable();
itemsFiltered=itemsFiltered.OrderBy(e=>(orderById?e.Text:e.Value));
返回htmlHelper.DropDownList for(
表情,
过滤过的项目,
第一要素,
HTMLAT贡品
);
}

如果您能提供任何帮助,我们将不胜感激。

下面是您为此编写单元测试的方法。请注意,因为您没有指定使用模拟对象框架,所以我将介绍穷人技术,这是最新的技术。如果您正在使用,还有另一个助手方法

需要注意的是,为了简化代码执行,我对扩展方法做了几处更改,这样测试就不会意外失败。无论如何,检查任何意外行为都是一种很好的防御编程实践

回到测试上来

SUT(测试中的系统)

这就是SUT(测试中的系统)和支持类型的样子。(请根据您的需要随时修改)

公共静态类MyHtmlHelper
{
公共静态MvcHtmlString EnumDropDownListForOrderBy
(本HtmlHelper HtmlHelper,
表情表情,
bool orderById,字符串firstElement=null,对象htmlAttributes=null,
Func fromLambFunc=null)
{
模型元数据=
ModelMetadata.FromLambdaExpression(表达式,htmlHelper.ViewData);
类型enumType=GetNonNullableModelType(元数据);
IEnumerable values=Enum.GetValues(enumType.Cast();
IEnumerable items=
value.Select(value=>newselectListItem()
{
Text=GetText(值),
Value=Value.ToString(),
所选=value.Equals(metadata.Model)
});
IEnumerable itemsFiltered=
items.Where(e=>!string.IsNullOrEmpty(e.Text)).AsEnumerable();
itemsFiltered=itemsFiltered.OrderBy(e=>(orderById?e.Text:e.Value));
返回htmlHelper.DropDownList for
(表达式、项过滤、第一元素、htmlAttributes);
}
私有静态类型GetNonNullableModelType(ModelMetadata元数据){
返回typeof(SomeEnum);
}
私有静态字符串GetText(TEnum值){
返回值.GetAttributeFrom(value.ToString())!=null
?value.GetAttributeFrom(value.ToString()).Description
:string.Empty;
}
}
公共静态类扩展MethodsAttr
{
公共静态T GetAttributeFrom(此对象实例,字符串propertyName)
其中T:Attribute
{
var attrType=typeof(T);
var property=instance.GetType().GetProperty(propertyName);
返回属性!=null?
(T) GetCustomAttributes(attrType,false).First():默认值(T);
}
}
公共枚举SomeEnum{A,}
单元测试

[TestFixture]
public class HtmlHelperTests
{
    [Test]
    public void EnumDropDownListForOrderBy_InvokeDropDownListFor_ReturnsExpectedSelectItemResult()
    {
        //Arrange
        var expected = "<select id=\"Foo\" name=\"Foo\"></select>";
        var fakeHtmlHelper = CreateHtmlHelperStaticStubs
        (new ViewDataDictionary(new FakeViewModel() {Foo = SomeEnum.A}));
        //var fakeHtmlHelper = CreateHtmlHelperUsingMoq
        (new ViewDataDictionary(new FakeViewModel(){Foo = SomeEnum.A}));

        //Act
        var result = fakeHtmlHelper.EnumDropDownListForOrderBy
        (model => model.Foo, It.IsAny<bool>(), null, null, null);

        //Assert
        Assert.AreEqual(expected, result.ToString());
    }


    private static HtmlHelper<FakeViewModel> 
         CreateHtmlHelperStaticStubs(ViewDataDictionary viewData)
    {
        var stubControllerContext = new ControllerContext(new FakeHttpContext(), new RouteData(), new FakeController());

        var stubViewContext = new ViewContext(stubControllerContext, new FakeView(),
            new ViewDataDictionary(new FakeViewModel() { Foo = SomeEnum.A }),
            new TempDataDictionary(), new TextMessageWriter());

        var fakeViewDataContainer = new FakeViewDataContainer();
        fakeViewDataContainer.ViewData = viewData;

        return new HtmlHelper<FakeViewModel>(stubViewContext, fakeViewDataContainer);
    }

    //Moq version
    private static HtmlHelper<FakeViewModel> 
       CreateHtmlHelperUsingMoq(ViewDataDictionary viewData)
    {
        var stubControllerContext = new Mock<ControllerContext>();
        stubControllerContext.Setup(x => x.HttpContext).Returns(new Mock<HttpContextBase>().Object);
        stubControllerContext.Setup(x => x.RouteData).Returns(new RouteData());
        stubControllerContext.Setup(x => x.Controller).Returns(new Mock<ControllerBase>().Object); ;

        var stubViewContext = new Mock<ViewContext>();
        stubViewContext.Setup(x => x.View).Returns(new Mock<IView>().Object);
        stubViewContext.Setup(x => x.ViewData).Returns(viewData);
        stubViewContext.Setup(x => x.TempData).Returns(new TempDataDictionary());

        var mockViewDataContainer = new Mock<IViewDataContainer>();

        mockViewDataContainer.Setup(v => v.ViewData).Returns(viewData);

        return new HtmlHelper<FakeViewModel>(stubViewContext.Object, mockViewDataContainer.Object);
    }
}   


class FakeHttpContext : HttpContextBase
{
    private Dictionary<object, object> _items = new Dictionary<object, object>();
    public override IDictionary Items { get { return _items; } }
}

class FakeViewDataContainer : IViewDataContainer
{
    private ViewDataDictionary _viewData = new ViewDataDictionary();
    public ViewDataDictionary ViewData { get { return _viewData; } set { _viewData = value; } }
}

class FakeController : Controller { }

class FakeView : IView
{
    public void Render(ViewContext viewContext, System.IO.TextWriter writer)
    {
        throw new NotImplementedException();
    }
}

public class FakeViewModel {
    public SomeEnum Foo { get; set; }
}
[TestFixture]
公共类HTMLHelpests
{
[测试]
public void EnumDropDownListForOrderBy_InvokeDropDownListFor_ReturnsExpectedSelectItemResult()
{
//安排
预期var=”;
var fakeHtmlHelper=createhtmlhelperstaticsubs
(新的ViewDataDictionary(新的FakeViewModel(){Foo=SomeEnum.A}));
//var fakeHtmlHelper=createhtmlhelpuresingmoq
(新的ViewDataDictionary(新的FakeViewModel(){Foo=SomeEnum.A}));
//表演
var result=fakeHtmlHelper.EnumDropDownList ForOrderBy
(model=>model.Foo,It.IsAny(),null,null,null);
//断言
Assert.AreEqual(应为result.ToString());
}
专用静态HtmlHelper
CreateHtmlHelperstaticSubs(ViewDataDictionary viewData)
{
var stubControllerContext=newcontrollercontext(new FakeHttpContext(),new RouteData(),new FakeController());
var stubViewContext=newviewcontext(stubControllerContext,new FakeView(),
新建ViewDataDictionary(新建FakeViewModel(){Foo=SomeEnum.A}),
新建TempDataDictionary(),新建TextMessageWriter());
var fakeViewDataContainer=新的fakeViewDataContainer();
fakeViewDataContainer.ViewData=ViewData;
返回新的HtmlHelper(stubViewContext、fakeViewDataContainer);
}
//最小起订量版本
专用静态HtmlHelper
CreateHtmlHelpPerusingMoq(ViewDataDictionary viewData)
{
var stubControllerContext=new Mock();
Setup(x=>x.HttpContext).Returns(newmock().Object);
Setup(x=>x.RouteData).Returns(newroutedata());
Setup(x=>x.Controller).Returns(newmock().Object);
var stubViewContext=new Mock();
Setup(x=>x.View).Returns(newmock().Object);
Setup(x=>x.ViewData).Returns(ViewData);
Setup(x=>x.TempData).Returns(newtempdatadictionary());
var mockViewDataContainer=new Mock();
mockViewDataContainer.Setup(v=>v.ViewData).Returns(ViewData);
R
[TestFixture]
public class HtmlHelperTests
{
    [Test]
    public void EnumDropDownListForOrderBy_InvokeDropDownListFor_ReturnsExpectedSelectItemResult()
    {
        //Arrange
        var expected = "<select id=\"Foo\" name=\"Foo\"></select>";
        var fakeHtmlHelper = CreateHtmlHelperStaticStubs
        (new ViewDataDictionary(new FakeViewModel() {Foo = SomeEnum.A}));
        //var fakeHtmlHelper = CreateHtmlHelperUsingMoq
        (new ViewDataDictionary(new FakeViewModel(){Foo = SomeEnum.A}));

        //Act
        var result = fakeHtmlHelper.EnumDropDownListForOrderBy
        (model => model.Foo, It.IsAny<bool>(), null, null, null);

        //Assert
        Assert.AreEqual(expected, result.ToString());
    }


    private static HtmlHelper<FakeViewModel> 
         CreateHtmlHelperStaticStubs(ViewDataDictionary viewData)
    {
        var stubControllerContext = new ControllerContext(new FakeHttpContext(), new RouteData(), new FakeController());

        var stubViewContext = new ViewContext(stubControllerContext, new FakeView(),
            new ViewDataDictionary(new FakeViewModel() { Foo = SomeEnum.A }),
            new TempDataDictionary(), new TextMessageWriter());

        var fakeViewDataContainer = new FakeViewDataContainer();
        fakeViewDataContainer.ViewData = viewData;

        return new HtmlHelper<FakeViewModel>(stubViewContext, fakeViewDataContainer);
    }

    //Moq version
    private static HtmlHelper<FakeViewModel> 
       CreateHtmlHelperUsingMoq(ViewDataDictionary viewData)
    {
        var stubControllerContext = new Mock<ControllerContext>();
        stubControllerContext.Setup(x => x.HttpContext).Returns(new Mock<HttpContextBase>().Object);
        stubControllerContext.Setup(x => x.RouteData).Returns(new RouteData());
        stubControllerContext.Setup(x => x.Controller).Returns(new Mock<ControllerBase>().Object); ;

        var stubViewContext = new Mock<ViewContext>();
        stubViewContext.Setup(x => x.View).Returns(new Mock<IView>().Object);
        stubViewContext.Setup(x => x.ViewData).Returns(viewData);
        stubViewContext.Setup(x => x.TempData).Returns(new TempDataDictionary());

        var mockViewDataContainer = new Mock<IViewDataContainer>();

        mockViewDataContainer.Setup(v => v.ViewData).Returns(viewData);

        return new HtmlHelper<FakeViewModel>(stubViewContext.Object, mockViewDataContainer.Object);
    }
}   


class FakeHttpContext : HttpContextBase
{
    private Dictionary<object, object> _items = new Dictionary<object, object>();
    public override IDictionary Items { get { return _items; } }
}

class FakeViewDataContainer : IViewDataContainer
{
    private ViewDataDictionary _viewData = new ViewDataDictionary();
    public ViewDataDictionary ViewData { get { return _viewData; } set { _viewData = value; } }
}

class FakeController : Controller { }

class FakeView : IView
{
    public void Render(ViewContext viewContext, System.IO.TextWriter writer)
    {
        throw new NotImplementedException();
    }
}

public class FakeViewModel {
    public SomeEnum Foo { get; set; }
}