我创建了一个REST API,它在DB上执行CRUD操作并从DB返回结果。现在,这是我的下面的代码:
class CreateRecords
{
public function createEntities($details)
{
if (trim($details['username']) == "") {
$this->result = "Username is empty.";
} else {
$this->result = create_record($userDetails);
}
return $this->result;
}
}
这里,在上面的代码中,create_record
是一个函数,它执行验证部分并将详细信息插入到db中,并返回新创建的记录的id。
现在,我的测试用例如下:
class TestCreateRecords
{
public function setUp()
{
$this->client = new GuzzleHttp\Client([
'base_uri' => 'http://localhost/test/'
]);
}
public function testCreateEntitiesAPI()
{
$response = $this->client->post('service.php', [
'json' => [
'username' => 'test@test.com',
'user_password' => 'test',
'first_name' => 'Test',
'last_name' => 'test',
'email1' => 'test@test.com'
]
]);
$actual_response = json_decode($response->getBody(), true);
$this->assertArrayHasKey("id", $actual_response, 'Un-successful.');
}
}
所以,我对此几乎没有疑问:
在我的主类文件中,create_record
函数在将详细信息插入数据库之前验证username
。它会检查username
是否已经可用。如果可用,它将不会创建记录并将响应发送为Already Available
。如果不可用,则它将创建一条记录并发送新创建的唯一ID。
现在,我想测试这两种情况,其中传递username
已在DB中可用而在DB中不可用。现在,在上面的测试用例中,每次运行测试之前我都必须对其进行更改,因此我可以测试方案,其中username
在DB中已经不可用。这对我来说似乎不合逻辑。
我想知道,还有其他方法可以实现这个目标吗?
有人建议我嘲笑create_record
方法来测试API并编写另一个测试用例来测试create_record
方法本身。但根据我的应用程序MVC框架,我现在似乎不可能。因为在create_record
方法中,有许多方法被调用,这些方法只调用其他方法。而且,我将不得不嘲笑那些数十种方法并为它们编写测试用例等等。
这对我们来说耗费时间和精力。所以我决定不在一个测试用例中模拟任何方法并测试整个API流程。
我想知道,这是一个好方法吗?它的副作用是什么?
答案 0 :(得分:1)
建议你尝试嘲笑的人是对的。很高兴你想开始测试更多,但它经常会在应用程序架构中出现问题。
单元测试最好只测试一个类或函数。如果您的所有函数都在调用其他函数一直到数据库插入,则它是一个端到端的测试。有这些可以,但在你的情况下,你想测试各种情况(当验证失败,因为存在用户名),你很快就会发现在端到端测试中测试所有边缘情况是慢
您已经有connect(&objectA, SIGNAL(MySignal()), &objectA, SLOT(MySlot()));
课程。在CreateRecords
类中使用了哪里?如果您正在使用某种依赖注入,您可以模拟控制器中的service.php
类(我猜测它是CreateRecords
。这样您就可以与API分开测试服务代码。这是一个例子:
service.php
然后,您可以创建仅测试每个图层的测试,例如