2013-09-27 35 views
1

我正在编写一些单元测试并且忍受我对单元测试我还很新。Yii单元测试用登录网页用户

我遇到的问题是我的很多保存调用的行为需要
用户id从Yii::app()->user->id

然而,当我运行单元测试,我得到的问题在用户没有登录。

有反正我可以无视标志的行为(例如if ($isInTestingMode))或登录用户在测试中类?

+0

我会这样做的方式是为登录用户设置一组测试,另一组用于未登录用户,不同之处在于设置方法,其中一个包括登录用户的代码。 。 。 – ernie

回答

1

我可能会建立一个你在测试中使用的用户对象。然后在适当的测试中(作为setup方法的一部分,如ernie在其评论中所述),交换测试用户对象。然后

测试用户对象将有一个工作原理是这样的方法:

public function getId() { 
    return 12; 
} 

public function getIsGuest() { 
    return false; 
} 

以上就是他们所说的“假”的对象。

在你的设置方法,你应该使用以下行:

Yii::app()->configure(array(
    'components' => array(
     'user' => array(
      'class' => 'path.to.FakeUser', 
     ) 
    ) 
)); 

您还可以,如果你想要的是默认用户(然后在正常CWebUser/WebUser掉添加到您的测试配置文件模型在测试中需要有一个未登录的用户

或者你可以在每个单元测试中为你的FakeUser(isLoggedIn = true/false)设置一个标志,我可能会自己选择这个选项...

1

像这样的测试不是单元测试秒。单元测试用于测试课程中的各个功能。 “登录用户”涵盖大量代码(登录,会话管理,导航到特定页面等)。我相信你正在寻找功能测试。你可以在这里了解更多:http://www.yiiframework.com/doc/guide/1.1/en/test.functional

+0

这就是说,你将如何*单元测试*一个单一的方法,其中一个调用用户 - >编号? – physicalattraction

+0

你会测试如何使用该属性。例如,如果方法返回'user-> id'的输出结果,你会检查你的user-> id'的值是否与返回值匹配。或者,如果该函数在另一个函数调用中使用该值,则可以对正在调用的第二个函数进行存根操作,并检查它是否与您期望的参数一起被调用。 –