2015-10-29 66 views
2

我最近开始学习单元测试MVC和使用NUnit的框架测试用例。我的问题是,我不明白我应该写什么测试用例。想象一下,我有CRUD操作,我想测试它们,那么我的测试用例条件应该如何。NUnit的测试与起订量

这里是我的接口类:

public interface IUserRepository 
{ 
    //Creating Single User Records into database using EF. 
    bool CreateUser(tbl_Users objUser); 

    //Updating Single User Records into database using EF. 
    void UpdateUser(tbl_Users objUser); 

    //Deleting Single User Records from database using EF. 
    bool DeleteUser(long IdUser); 
} 

这里是我的仓储类:

public class UserRepository : IUserRepository 
{ 
    DBContext objDBContext = new DBContext();  

    /// <summary> 
    /// Creating new User Record into Database 
    /// </summary> 
    /// <param name="objUser"></param> 
    public bool CreateUser(tbl_Users objUser) 
    { 
     bool blnResult = false; 
     objUser.MiddleName = string.IsNullOrEmpty(objUser.MiddleName) ? string.Empty : objUser.MiddleName.Trim(); 
     objUser.Photo = string.Empty; 
     objUser.Approved = false; 
     objUser.CreatedDate = DateTime.Now; 
     objUser.DeleteFlag = false; 
     objUser.UpdBy = 0; 
     objUser.UpdDate = DateTime.Now; 
     objDBContext.tbl_Users.Add(objUser); 
     blnResult = Convert.ToBoolean(objDBContext.SaveChanges()); 
     return blnResult; 
    } 

    /// <summary> 
    /// Updating existing User Record into Database 
    /// </summary> 
    /// <param name="objUser"></param> 
    public void UpdateUser(tbl_Users objUser) 
    { 
     objUser.MiddleName = string.IsNullOrEmpty(objUser.MiddleName) ? string.Empty : objUser.MiddleName.Trim(); 
     objUser.Approved = true; 
     objUser.UpdBy = objUser.IdUser; 
     objUser.UpdDate = DateTime.Now; 
     objDBContext.Entry(objUser).State = EntityState.Modified; 
     objDBContext.SaveChanges(); 
    } 

    /// <summary> 
    /// Deleting existing User Record from Database 
    /// </summary> 
    /// <param name="IdUser"></param> 
    public bool DeleteUser(long IdUser) 
    { 
     bool blnResult = false; 
     tbl_Users objUser = objDBContext.tbl_Users.Where(x => x.IdUser == IdUser).Single(); 
     objUser.ConfirmPassword = objUser.Password; 
     objUser.UpdDate = DateTime.Now; 
     objUser.DeleteFlag = true; 
     blnResult = Convert.ToBoolean(objDBContext.SaveChanges()); 
     return blnResult; 
    }   
} 

,这里是我的控制器类

public class UserController : Controller 
{ 
    tbl_Users objUser = new tbl_Users(); 
    UserRepository Repository = new UserRepository();   

    [ValidateAntiForgeryToken] 
    [HttpPost] 
    public ActionResult Create(tbl_Users objUser) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       Repository.CreateUser(objUser); 
       return RedirectToAction("Update", "User"); 
      } 
      catch 
      { 
       return View(); 
      } 
     } 
     return View(); 
    }  

    [ValidateAntiForgeryToken] 
    [HttpPost] 
    public ActionResult Update(tbl_Users objUser) 
    { 
     Repository.UpdateUser(objUser); 
     return View(); 
    } 

    public ActionResult Delete(long IdUser = 0) 
    { 
     bool blnResult = Repository.DeleteUser(IdUser); 
     if (blnResult) 
     { 
      return View("Delete"); 
     } 
     else 
     { 
      return View(); 
     } 
    } 
} 

下面是测试案例,我试着以执行使用起订量

[TestFixture] 
public class UserControllerTest 
{ 
    UserController Controller; 

    [SetUp] 
    public void Initialise() 
    { 
     Controller = new UserController(); 
    }  

    [Test] 
    public void DeleteTest() 
    { 
     var ObjUser = new Mock<IUserRepository>(); 

     ObjUser.Setup(X => X.DeleteUser(It.IsAny<long>())).Returns(true); 

     var Result = ObjUser.Object.DeleteUser(1); 
     Assert.That(Result, Is.True); 
    }   

    [Test] 
    public void CreateTest() 
    { 
     tbl_Users User = new tbl_Users(); 
     Mock<IUserRepository> MockIUserRepository = new Mock<IUserRepository>(); 
     MockIUserRepository.Setup(X => X.CreateUser(It.IsAny<tbl_Users>())).Returns(true); 

     var Result = MockIUserRepository.Object.CreateUser(User); 

     Assert.That(Result, Is.True); 
    }   

    [TearDown] 
    public void DeInitialise() 
    { 
     Controller = null; 
    } 
} 

谁能告诉我,怎么写测试用例上述控制器的操作方法与有关使用起订量测试用例简要说明。

回答

3

你有一对夫妇的问题。首先是你没有测试过你的控制器,你已经测试了你的模拟器。第二个是你的控制器创建它自己的用户存储库。这意味着即使您正在测试它,您也无法提供模拟用户存储库来测试。

第一个解决方案是通过调用其方法并声明结果来测试控制器,但是在测试中可以完成之前,您将解决第二个问题。

要解决第二个问题,您需要应用dependency inversion principal并将您的IUserRepository实施传递到您的控制器(通过理想的构造函数)。

你可以改变你的控制器有这样的构造:

public class UserController : Controller 
{ 
    tbl_Users objUser = new tbl_Users(); 
    IUserRepository Repository; 

    public UserController(IUserRepository userRepository) 
    { 
     Repository = userRepository; 
    } 

    ...etc  
} 

那么你可以改变你的测试更是这样的:

[TestFixture] 
public class UserControllerTest 
{ 
    [Test] 
    public void DeleteTest() 
    { 
     var ObjUser = new Mock<IUserRepository>(); 

     ObjUser.Setup(X => X.DeleteUser(It.IsAny<long>())).Returns(true); 

     var Result = new UserController(ObjUser.Object).Delete(1); 
     Assert.That(Result, //is expected view result with expected model); 
     Assert.That(ObjUser.Verify(), Is.True);   
    }   

    [Test] 
    public void CreateTest() 
    { 
     tbl_Users User = new tbl_Users(); 
     Mock<IUserRepository> MockIUserRepository = new Mock<IUserRepository>(); 
     MockIUserRepository.Setup(X => X.CreateUser(It.IsAny<tbl_Users>())).Returns(true); 

     var Result = var Result = new UserController(ObjUser.Object).Create(User);; 

     Assert.That(Result, //is a view result with expected view model); 
     Assert.That(ObjUser.Verify(), Is.True); 
    }   
} 

现在正在测试的实际控制人检查它返回正确的视图,并以预期的方式与模拟存储库交互

+0

在上面写的测试用例中有太多的编译错误。预期视图模型的视图结果“,这意味着在断言中,它是一个评论或我需要替换 – Amar

+0

是的,代码并不意味着编译(我没有写在IDE中,只是在网页上和我的到底是哪的方法来使用migth一点点关闭),而是引导你来有什么问题的回忆。如果您正在调用控制器的Delete方法,则会返回一个'ActionResult',但在Delete的情况下,它实际上是一个ViewResult实例,因此您的测试需要验证返回的ActionResult实际上是一个'ViewResult'实例,它具有预期的视图模型 –