Unit testing 使用nunit对通用htmlHelper方法进行单元测试
我是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,
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; }
}