-2

単体テストの書き方

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);
}

解決方法がわかりません。

4

1 に答える 1

2

コードをテスト可能にするには、依存関係をコントローラーに注入する必要があります (依存関係をコントローラーに渡すか、直接インスタンス化するかどうかは、このコードからはわかりません)。また、具体的な実装ではなく、抽象化 (できればインターフェイス) に依存するようにコントローラーを作成する必要があります。

EmployeeService は次のインターフェイスを実装する必要があります。

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

次に、抽象化に応じてコントローラーを作成します (ここではサンプルとして 1 つの依存関係のみを示します)。

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 の詳細については、こちらをご覧ください。

于 2012-10-19T18:21:48.200 に答える