2012-10-19 154 views
-2

如何編寫單元測試控制器MVC3單元測試

public ActionResult Details() 
{ 
    EmployeeDTO employee = this.EmployeeService.GetLoggedInEmployee(); 
    EmployeeModel model = assembler.ToEmployeeModel(employee); 
    model.Title = GetEmployeeNameTitle(employee); 
    model.Controller = "LoanProcessor"; 
    model.SelectedTab = MainNavTabs.LoanProcessor; 
    return View(model); 
} 

我不知道如何解決它。

+0

沒有你首先回答以下問題,你的問題就無法回答:什麼是「this.EmployeeService」?什麼是「彙編器」?什麼是GetEmployeeNameTitle方法?什麼是MainNavTabs.LoanProcessor? –

回答

2

爲了使代碼可測試,應該向控制器注入依賴關係(如果將依賴關係傳遞給控制器​​,或直接實例化它們,這段代碼並不清楚)。你也應該讓你的控制器依賴於抽象(最好是接口)而不是具體的實現。

的EmployeeService應該實現此接口:

public interface IEmployeeService 
{ 
    EmployeeDTO GetLoggedInEmployee(); 
    // other methods of service 
} 

然後你讓你的控制器依賴於抽象(這裏顯示的樣品只有一個依賴):

public class FooController : Controller 
{ 
    private IEmployeeService _employeeService; 

    public FooController(IEmployeeService employeeService) 
    { 
     _employeeService = employeeService; 
    } 
} 

現在你可以嘲笑的依賴,並開始寫作控制器測試(NUnit和Moq樣品):

[Test] 
public void ShouldProvideEmployeeDetails() 
{ 
    // Arrange 
    EmployeeDTO bob = new EmployeDTO("Bob", 42); 
    Mock<IEmployeeService> employeeService = new Mock<IEmployeeService>(); 
    employeeService.Setup(s = s.GetLoggedInEmployee()).Returns(bob); 
    FooController controller = new FooController(employeeService.Object); 
    // Act 
    var result = controller.Details() as ViewResult; 
    // Assert 
    EmployeeModel model = result.ViewData.Model; 
    Assert.That(model.Title, Is.EqualTo("Bob")); 
    Assert.That(model.Controller, Is.EqualTo("LoanProcessor")); 
} 

然後編寫代碼來通過這個測試。 您可以在TDD here上閱讀更多信息。

+0

謝謝......它的工作 –