• Integration_Unit test coding standard


    Integration & Unit test coding standard

    命名规则

    好的命名规则,直接从命名就可以清楚的知道该测试方法测试的内容和目的,而不用额外的添加注释说明。对于MVC而言,测试Controller是重点。

    Testing Controller

    对于Controller的测试,命名方式总共分为三段:

    Action_Return[_Condition]

    • Action:Controller的Action
    • Return:期望的返回结果
    • Condition:在怎样的条件下

    比如如下的Controller:

    public class AdminUserController : Controller
    {
    	public async Task<IActionResult> Details(string id)
    

    单元测试方法命名如下:

    [Fact]
    public async Task Details_ReturnViewResult_WhenExitsUserId()
    [Fact]
    public async Task Details_ReturnNotFoundViewResult_WhenNotExitsUserId()
    

    集成测试方法命名如下;

    [Fact]
    public async Task Details_ReturnDetailsPage_WhenExitsUserId()
    [Fact]
    public async Task Details_ReturnNotFound_WhenNotExitsUserId()
    

    另外,对于需求:Admin账号登录之后,菜单额外显示Admin菜单,单元测试无法做到,必须要用集成测试:

    [Fact]
    public async Task Login_ReturnHomePageWithAdminMenu_WhenIsAdmin()
    

    集成测试要比单元测试慢几个数量级,所以能用单元测试验证的地方,就不要用集成测试

    单元测试可以帮助我们Review Controller的职责

    典型的controllers职责:

    • 验证 ModelState.IsValid
    • 如果 ModelState 不合法,返回错误响应
    • 取得持久化的业务实体
    • 对业务实体采取行动
    • 持久化存储业务实体
    • 返回合适的 IActionResult

    避免在controllers中添加不必要的职责,以及保证测试仅仅集中在controller的职责,测试controllers的逻辑,在合法和不合法的输入下的行为,而不是检测其他的方法是否正确,举个例子:

    [HttpPost]
    public async Task<IActionResult> Index(NewSessionModel model)
    {
    	if (!ModelState.IsValid)
    	{
    		return BadRequest(ModelState);
    	}
    
    	await _sessionRepository.AddAsync(new BrainstormSession()
    	{
    		DateCreated = DateTimeOffset.Now,
    		Name = model.SessionName
    	});
    
    	return RedirectToAction("Index");
    }
    

    单元测试如下:

    [Fact]
    public async Task IndexPost_ReturnsBadRequest_WhenModelStateIsInvalid()
    {
        // Arrange
        var mockRepo = new Mock<IBrainstormSessionRepository>();
        mockRepo.Setup(repo => repo.ListAsync()).Returns(Task.FromResult(GetTestSessions()));
        var controller = new HomeController(mockRepo.Object);
        controller.ModelState.AddModelError("SessionName", "Required");
        var newSession = new HomeController.NewSessionModel();
    
        // Act
        var result = await controller.Index(newSession);
    
        // Assert
        var badRequestResult = Assert.IsType<BadRequestObjectResult>(result);
        Assert.IsType<SerializableError>(badRequestResult.Value);
    }
    

    注意上面的测试主动给controller的ModelState添加了Error,而不是等Controller的ModelState.IsValid方法来判断Model是否输入了SessionName,ModelState.IsValid是否可以正常工作是集成测试负责的内容,单元测试只要负责检测 !ModelState.IsValid 时,是否返回BadRequest!单元测试要做的是,覆盖到Controller的每一个Return!

    一般公用方法的单元测试

    对于一般公用方法的测试,命名方式总共分为三段:

    Action_Return[_Condition]

    • Action:方法名称
    • Return:期望的返回结果
    • Condition:在怎样的条件下

    比如一个用来检测奇数偶数的类:

    public class OddEvenNumberChecker
    {
    	public bool IsOdd(int number);
    	public bool IsEven(int number);
    }
    

    单元测试如下:

    public class OddEvenNumberCheckerTest
    {
    	[Fact]
    	public void IsOdd_ReturnTrue_When1357();
    	[Fact]
    	public void IsOdd_ReturnFalse_When2468();
    	[Fact]
    	public void IsEven_ReturnFalse_When1357();
    	[Theory] 
    	[InlineData(2)]
    	[InlineData(4)] 
    	[InlineData(6)] 
    	[InlineData(8)] 
    	public void IsEven_ReturnTrue_When2468(int value);
    }
    
  • 相关阅读:
    ie 标题写入问题
    预览图片
    form表单submit事件
    SpringGraph 20101030 11:08[转]
    flexunable to transcode image
    navicate导入和导出数据库(转)
    Flex转自新浪微博
    zk中的Datebox中得到Timestamp
    反向代理
    flash builder sdk 4[转自IYeye]
  • 原文地址:https://www.cnblogs.com/windchen/p/6604030.html
Copyright © 2020-2023  润新知