0

私は 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
4

1 に答える 1

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);
}
于 2012-11-21T06:44:27.400 に答える