當我試圖測試一個ASP.Net MVC控制器/動作時,我很難在單元測試模式中纏繞我的頭。如何在操作中對具有私有方法的ASP.Net MVC控制器進行單元測試?
用下面的代碼,我試圖寫的ShowPerson()
方法測試:
public class PersonController : Controller
{
private IDataAccessBlock _dab;
public PersonController()
: this(new DataAccessBlock())
{ }
public PersonController(IDataAccessBlock dab)
{
_dab = dab;
}
public ActionResult ShowPerson(PersonRequestViewModel personRequest)
{
var person = GetPersonViewModel(personRequest);
return View("Person", person);
}
private PersonViewModel GetPersonViewModel(PersonRequestViewModel personRequest)
{
var personService = new CommonDomainService.PersonService(_dab);
var dt = personService.GetPersonInfo(personRequest.Id);
var person = new PersonViewModel();
if (dt.Rows.Count == 1)
{
person.FirstName = dt.Rows[0]r["FIRSTNAME"]);
person.LastName = dt.Rows[0]["LASTNAME"];
}
return person;
}
}
,我使用(使用NUnit和MOQ)測試:
[Test]
public void ShowPerson_Action_Should_Return_Person_View()
{
// Arrange
string expected = "Person";
Mock<PersonRequestViewModel> personRequestViewModelMock = new Mock<PersonRequestViewModel>();
personRequestViewModelMock.SetupProperty(f => f.Id, 123456);
Mock<IDataAccessBlock> mockDab = new Mock<IDataAccessBlock>();
PersonController personController = new PersonController(mockDab.Object);
// Act
ViewResult result = personController.ShowPerson(personRequestViewModelMock.Object) as ViewResult;
// Assert
personRequestViewModelMock.Verify();
result.Should().Not.Be.Null();
if (result != null) Assert.AreEqual(expected, result.ViewName, "Unexpected view name");
}
一切似乎直到行if (dt.Rows.Count == 1)
遇到。我得到一個「未設置爲對象實例的對象引用」。
我認爲一定有什麼時髦與方式,以下兩行寫:
var personService = new CommonDomainService.PersonService(_dab);
var dt = personService.GetPersonInfo(personRequest.Id);
,但我不知道在哪裏可以從這裏走。我有很多看起來像這樣的代碼。我做錯了什麼,或者有沒有真正的方法來測試?
感謝您的任何幫助或指針。
掛鉤一個調試器,看看發生了什麼。 –
@DanielMann我已經這樣做了。 'dt'爲空,因爲'GetPersonInfo()'方法正在使用模擬數據訪問塊。在下面的回答中,@sri指出了我的正確方向。我添加了一個簡短的問題,我希望他能夠清理,然後接受他的答案。 –