Asp.net mvc 测试控制器无参数构造函数
我的应用程序中有一个相当基本的HomeController,我为此编写了一个测试类。在测试类上运行代码覆盖率分析后,我意识到我没有对默认构造函数进行任何测试 这是我的家庭控制器Asp.net mvc 测试控制器无参数构造函数,asp.net-mvc,unit-testing,Asp.net Mvc,Unit Testing,我的应用程序中有一个相当基本的HomeController,我为此编写了一个测试类。在测试类上运行代码覆盖率分析后,我意识到我没有对默认构造函数进行任何测试 这是我的家庭控制器 public class HomeController : BaseController { private INewsRepository _newsRepository; private INewsletterRepository _newsletterRepository; private
public class HomeController : BaseController
{
private INewsRepository _newsRepository;
private INewsletterRepository _newsletterRepository;
private string _currentLanguage;
public HomeController()
{
_newsRepository = NewsRepository.Current;
_newsletterRepository = NewsletterRepository.Current;
_currentLanguage = ApplicationConfig.Current.CurrentLanguage;
}
public HomeController(INewsRepository newsRepository, INewsletterRepository newsletterRepository, string currentLanguage)
{
_newsRepository = newsRepository;
_newsletterRepository = newsletterRepository;
_currentLanguage = currentLanguage;
}
public ActionResult Index()
{
return View();
}
public ActionResult LatestNews()
{
return View(_newsRepository.ListAll().Where(n => n.LanguageKey.ToLower() == _currentLanguage.ToLower()).OrderByDescending(n => n.Date).Take(10));
}
public ActionResult LatestNewsletters()
{
return View(_newsletterRepository.ListAll().Where(n => n.LanguageKey.ToLower() == _currentLanguage.ToLower()).OrderByDescending(n => n.Date).Take(10));
}
}
这是我的测试课程:
[TestClass]
public class HomeControllerTest
{
private INewsletterRepository _mockNewsletterRepostiory = null;
private INewsRepository _mockNewsRepostiory = null;
private List<News> _fakeNewsList = new List<News> {
new News{Id = 0, Title = "some title", Date = new DateTime(1989, 2, 19), LanguageKey = "fa", Description = "some description"},
new News{Id = 1, Title = "some title", Date = new DateTime(1989, 2, 20), LanguageKey = "fa", Description = "some description"},
new News{Id = 2, Title = "some title", Date = new DateTime(1989, 2, 21), LanguageKey = "fa", Description = "some description"},
new News{Id = 3, Title = "some title", Date = new DateTime(1989, 2, 22), LanguageKey = "fa", Description = "some description"}
};
private List<Newsletter> _fakeNewsletterList = new List<Newsletter>
{
new Newsletter{ Id = 0, Description = "some description", UrlKey = "first-newsletter", Title = "some title", SendDate = null, NewsletterContents = null, LanguageKey = "fa", Date = new DateTime(1989, 2, 19) },
new Newsletter{ Id = 1, Description = "some description", UrlKey = "first-newsletter", Title = "some title", SendDate = null, NewsletterContents = null, LanguageKey = "fa", Date = new DateTime(1989, 2, 20) },
new Newsletter{ Id = 2, Description = "some description", UrlKey = "first-newsletter", Title = "some title", SendDate = null, NewsletterContents = null, LanguageKey = "fa", Date = new DateTime(1989, 2, 21) },
new Newsletter{ Id = 3, Description = "some description", UrlKey = "first-newsletter", Title = "some title", SendDate = null, NewsletterContents = null, LanguageKey = "fa", Date = new DateTime(1989, 2, 22) }
};
[TestInitialize]
public void Setup()
{
// Mock News Repository
var mockNewsRepository = MockRepository.GenerateStub<INewsRepository>();
mockNewsRepository.Stub(m => m.ListAll()).Return(_fakeNewsList.AsQueryable());
// Mock Newsletter Repository
var mockNewsletterRopository = MockRepository.GenerateStub<INewsletterRepository>();
mockNewsletterRopository.Stub(m => m.ListAll()).Return(_fakeNewsletterList.AsQueryable());
_mockNewsletterRepostiory = mockNewsletterRopository;
_mockNewsRepostiory = mockNewsRepository;
}
[TestMethod]
public void IndexReturnsView()
{
// Arrange
HomeController homeController = new HomeController(_mockNewsRepostiory, _mockNewsletterRepostiory, "fa");
// Act
ViewResult result = homeController.Index() as ViewResult;
// Assert
Assert.AreEqual("", result.ViewName);
}
[TestMethod]
public void LatestNewsReturnsCorrectObject()
{
// Arrange
HomeController homeController = new HomeController(_mockNewsRepostiory, _mockNewsletterRepostiory, "fa");
// Act
ViewResult result = homeController.LatestNews() as ViewResult;
// Assert
Assert.IsNotNull(result.ViewData.Model, "Result model is not null.");
Assert.IsTrue(_fakeNewsList.OrderByDescending(n => n.Date).SequenceEqual(result.ViewData.Model as IQueryable<News>), "Model is correct");
}
[TestMethod]
public void LatestNewslettersReturnsCorrectObject()
{
// Arrange
HomeController homeController = new HomeController(_mockNewsRepostiory, _mockNewsletterRepostiory, "fa");
// Act
ViewResult result = homeController.LatestNewsletters() as ViewResult;
// Assert
Assert.IsNotNull(result.ViewData.Model, "Result model is not null.");
Assert.IsTrue(_fakeNewsletterList.OrderByDescending(n => n.Date).SequenceEqual(result.ViewData.Model as IQueryable<Newsletter>), "Model is correct");
}
}
[TestClass]
公共类家庭控制器测试
{
private INewsletterRepository\u MockNewsletterRepository=null;
私有INewsRepository\u MockNewsRepository=null;
私有列表_fakeNewsList=新列表{
新新闻{Id=0,Title=“some Title”,Date=new DateTime(1989,2,19),LanguageKey=“fa”,Description=“some Description”},
新新闻{Id=1,Title=“some Title”,Date=new DateTime(1989,2,20),LanguageKey=“fa”,Description=“some Description”},
新新闻{Id=2,Title=“some Title”,Date=new DateTime(1989,2,21),LanguageKey=“fa”,Description=“some Description”},
新新闻{Id=3,Title=“some Title”,Date=new DateTime(1989,2,22),LanguageKey=“fa”,Description=“some Description”}
};
私人名单_fakenewslettlist=新名单
{
新时事通讯{Id=0,Description=“some Description”,UrlKey=“first Newsletter”,Title=“some Title”,SendDate=null,newslettescontents=null,LanguageKey=“fa”,Date=new DateTime(1989,2,19)},
新时事通讯{Id=1,Description=“some Description”,UrlKey=“first Newsletter”,Title=“some Title”,SendDate=null,newslettescontents=null,LanguageKey=“fa”,Date=new DateTime(1989,2,20)},
新时事通讯{Id=2,Description=“some Description”,UrlKey=“first Newsletter”,Title=“some Title”,SendDate=null,newslettescontents=null,LanguageKey=“fa”,Date=new DateTime(1989,2,21)},
新时事通讯{Id=3,Description=“some Description”,UrlKey=“first Newsletter”,Title=“some Title”,SendDate=null,newslettescontents=null,LanguageKey=“fa”,Date=new DateTime(1989,2,22)}
};
[测试初始化]
公共作废设置()
{
//模拟新闻库
var mockNewsRepository=MockRepository.generateSub();
mockNewsRepository.Stub(m=>m.ListAll()).Return(_fakeNewsList.AsQueryable());
//模拟通讯库
var mocknewsletterPropository=MockRepository.GenerateStub();
mocknewsletterPropository.Stub(m=>m.ListAll()).Return(_fakeNewsletterList.AsQueryable());
_MockNewsletterRepository=MockNewsletterPropository;
_mockNewsRepository=mockNewsRepository;
}
[测试方法]
公共无效索引ReturnsView()
{
//安排
HomeController HomeController=新的HomeController(_mockNewsRepository,_mockNewsRepository,“fa”);
//表演
ViewResult=homeController.Index()作为ViewResult;
//断言
Assert.AreEqual(“,result.ViewName”);
}
[测试方法]
public void LatestNewsReturnsCorrectObject()的最新版本
{
//安排
HomeController HomeController=新的HomeController(_mockNewsRepository,_mockNewsRepository,“fa”);
//表演
ViewResult=homeController.LatestNews()作为ViewResult;
//断言
Assert.IsNotNull(result.ViewData.Model,“结果模型不为null”);
Assert.IsTrue(_fakeNewsList.OrderByDescending(n=>n.Date).SequenceEqual(result.ViewData.Model作为IQueryable),“模型是正确的”);
}
[测试方法]
public void LatestNewslettersReturnsCorrectObject()
{
//安排
HomeController HomeController=新的HomeController(_mockNewsRepository,_mockNewsRepository,“fa”);
//表演
ViewResult=homeController.LatestNewslettes()作为ViewResult;
//断言
Assert.IsNotNull(result.ViewData.Model,“结果模型不为null”);
Assert.IsTrue(_fakenewslettlist.OrderByDescending(n=>n.Date).SequenceEqual(result.ViewData.Model为IQueryable),“模型正确”);
}
}
首先,我真的需要测试这个构造函数吗?
其次,将_newsRepository和其他家伙公开并只读,然后在构建控制器后编写一个测试方法来检查它们的类型,这是一个好做法吗?我建议为构造函数编写一个测试的唯一原因是如果您非常关心获得尽可能多的代码覆盖率。测试您可以创建控制器实例的事实,以及在ctor中创建的每个对象的实例是否有效,并不是一个非常有价值的测试。我认为这是浪费时间 因此,对于您的第一个问题,我建议您不要担心对ctor进行单元测试。如果ctor中存在问题,那么您将通过其他单元测试很快注意到它,正如我在下一篇评论中所解释的
至于将存储库类公开为只读,我不建议这样做。关于单元测试,您真正需要关注的是控制器的功能,特别是使用在ctor中创建的对象的方法。这就是你需要集中精力的地方。这些测试将告诉您这些是否是这些对象的ctor中的问题。是
ctor
您对controller
或constructor
的简称吗?ctor
是constructor
的简称。谢谢。这帮了大忙:-)@JasonEvans“如果通过其他单元测试,您会注意到在ctor中存在问题”:如果没有单元测试使用无参数ctor会怎么样?在我的例子中,我有一些测试只使用依赖注入构造函数,没有任何测试(甚至是被动地)检查无参数构造函数是否存在。我在尝试运行应用程序时遇到了问题,因为一些控制器遗漏了这些控制器,所以MVC框架无法实例化它们。这里应该做什么?一个测试来检查该类是否有一个无参数的CtoR,除非PAR