单元测试在编辑_get动作中失败

时间:2012-11-21 05:21:44

标签: asp.net-mvc unit-testing nunit moq

我为edit_get动作写了一个单元测试 我的控制器动作是

 public class GroupController : Controller
  {
     private readonly IGroupService groupService;
     public GroupController(IGroupService groupService)
     {
       this.groupService = groupService;
      }
      public ActionResult EditGroup(int id)
       {
          var group = groupService.GetGroup(id);
          CreateGroupFormModel editGroup = Mapper.Map<Group, CreateGroupFormModel>(group);
          if (group == null)
           {
            return HttpNotFound();
          }
           return View("_EditGroup", editGroup);
       }

控制器动作正常。 但是当我写单元测试时,它会失败 我的测试是

[Test]
    public void Edit_Get_ReturnsView()
    {
    //Arrange
    CreateGroupFormModel group = new CreateGroupFormModel()
    {
     GroupId = 2, 
     GroupName = "Test",

     Description = "test" };
     GroupController controller = new GroupController();
    var fake = groupService.GetGroup(2);
    groupRepository.Setup(x => x.GetById(2)).Returns(fake);
    Mapper.CreateMap<CreateGroupFormModel, Group>().ForAllMembers(opt => opt.Ignore());
    Mapper.AssertConfigurationIsValid();
    ViewResult actual = controller.EditGroup(2) as ViewResult;
    Assert.IsNotNull(actual, "View Result is null");
   }

任何人都可以帮助我。

,测试失败
Expected Not Null
actual Null

1 个答案:

答案 0 :(得分:1)

在您的控制器操作中,您正在调用var group = groupService.GetGroup(id);,并且不清楚此groupService的来源。在你的单元测试中你必须嘲笑它​​。为此,GroupController必须将此依赖项作为构造函数注入。

同样在你的单元测试中,你似乎声明了一些从未使用的group变量。

例如:

public class GroupController: Controller
{
    private readonly IGroupService groupService;
    public GroupController(IGroupService groupService)
    {
        this.groupService = groupService;
    }

    public ActionResult EditGroup(int id)
    {
        var group = this.groupService.GetGroup(id);
        CreateGroupFormModel editGroup = Mapper.Map<Group, CreateGroupFormModel>(group);
        if (group == null)
        {
            return HttpNotFound();
        }
        return View("_EditGroup", editGroup);
    }
}

现在在您的单元测试中,您可以模拟此组服务并提供对GetGroup方法结果的期望:

[Test]
public void Edit_Get_ReturnsView()
{
    // arrange
    var group = new CreateGroupFormModel 
    {
        GroupId = 2,
        GroupName ="Test", 
        Description ="test" 
    };
    var groupServiceMock = new Mock<IGroupService>();
    groupServiceMock.Setup(x => x.GetGroup(group.GroupId)).Returns(group);
    var sut = new GroupController(groupServiceMock.Object);
    Mapper.CreateMap<CreateGroupFormModel, Group>().ForAllMembers(opt => opt.Ignore());
    Mapper.AssertConfigurationIsValid();

    // act
    var actual = sut.EditGroup(group.GroupId) as ViewResult;

    // assert
    Assert.IsNotNull(actual);
    Assert.IsInstanceOfType(typeof(ViewResult), actual);
}