依赖已测试Validator类的Handler类单元测试方案问询
Handler类单元测试的正确姿势:避免重复验证依赖逻辑
不需要重复编写Validator已经覆盖的错误验证逻辑——因为Validator的单元测试已经确保它能返回正确的错误,Handler的单元测试应该聚焦于Handler自身的职责,也就是它如何使用Validator的结果,而非Validator本身的正确性。
Handler单元测试的核心思路
Handler的单元测试要做的是隔离依赖,验证交互逻辑:
- 使用Mock/Stub替代真实的Validator实例,完全控制Validator的返回结果
- 只测试Handler对Validator输出的处理逻辑,而非Validator的内部逻辑
具体测试场景
- 验证通过场景:Mock Validator返回"无错误",测试Handler是否执行后续业务逻辑(如调用服务、返回成功响应),同时验证Validator的
validate方法是否被正确调用(参数、调用次数符合预期) - 验证失败场景:Mock Validator返回预设的特定错误,测试Handler是否正确处理该错误(如包装成符合接口规范的响应、返回对应状态码)——注意这里不是测"Validator会不会产生这个错误",而是测"Handler拿到这个错误后有没有做它该做的事"
- 异常处理场景:如果Validator可能抛出异常,Mock它抛出特定异常,测试Handler是否能正确捕获并处理
示例代码(Python)
from unittest.mock import Mock from my_app import Handler, ValidationError def test_handler_processes_valid_request(): # 构建Mock Validator,预设验证通过的结果 mock_validator = Mock() mock_validator.validate.return_value = None # None表示无错误 handler = Handler(validator=mock_validator) test_request = {"user_id": 123, "content": "valid content"} response = handler.handle(test_request) # 验证Validator的validate方法被正确调用 mock_validator.validate.assert_called_once_with(test_request) # 验证Handler返回成功响应 assert response["status"] == "success" assert response["data"]["message"] == "Request processed" def test_handler_forwards_validation_failure(): # 构建Mock Validator,预设特定验证错误 mock_validator = Mock() test_error = ValidationError("user_id must be positive integer") mock_validator.validate.return_value = test_error handler = Handler(validator=mock_validator) test_request = {"user_id": -1, "content": "invalid"} response = handler.handle(test_request) # 验证Validator被调用 mock_validator.validate.assert_called_once_with(test_request) # 验证Handler正确包装并返回错误 assert response["status"] == "error" assert response["message"] == "user_id must be positive integer" assert response["code"] == 400
关键原则
- 不要在Handler的测试中验证"Validator是否能识别无效请求"——这是Validator测试的职责
- 只验证"当Validator返回X时,Handler是否做了Y"——这是Handler独有的职责
内容的提问来源于stack exchange,提问作者Szyszka947
相关产品推荐
相关产品推荐

