我对Laravel和一般的单元测试都很陌生.我正在尝试为我的AccountController编写一些测试,但我遇到了一个障碍.
我正在使用Sentry来处理站点中的用户和组.我正在尝试测试我的控制器是否正在处理Sentry抛出的异常.所以我处理登录POST的控制器方法如下所示:
public function postLogin(){
$credentials = array(
'email' => Input::get('email'),
'password' => Input::get('password')
);
try{
$user = $this->authRepo->authenticate($credentials, true);
return Redirect::route('get_posts');
}
catch (Exception $e){
$message = $this->getLoginErrorMessage($e);
return View::make('login', array('errorMsg' => $message));
}
}
Run Code Online (Sandbox Code Playgroud)
authRepository只是一个使用Sentry来处理身份验证的存储库.现在我想测试一下,如果没有指定电子邮件地址,则抛出LoginRequiredException并且用户看到错误消息.这是我的测试:
public function testPostLoginNoEmailSpecified(){
$args = array(
'email' => 'test@test.com'
);
$this->authMock
->shouldReceive('authenticate')
->once()
->andThrow(new Cartalyst\Sentry\Users\LoginRequiredException);
$this->action('POST', 'MyApp\Controllers\AccountController@postLogin', $args);
$this->assertViewHas('errorMsg', 'Please enter your email address.');
}
Run Code Online (Sandbox Code Playgroud)
但是,测试没有通过.它出于某种原因吐出来的是:
There was 1 error:
1) AccountControllerTest::testPostLoginNoEmailSpecified
Cartalyst\Sentry\Users\LoginRequiredException:
Run Code Online (Sandbox Code Playgroud)
我是否错误地使用了andThrow()方法?如果有人能够了解正在发生的事情,那将非常感激.
提前致谢!
我正在构建一个基本的时间记录应用程序,我有一个使用django-taggit的待办事项模型.我的Todo模型看起来像这样:
class Todo(models.Model):
project = models.ForeignKey(Project)
description = models.CharField(max_length=300)
is_done = models.BooleanField(default=False)
billable = models.BooleanField(default=True)
date_completed = models.DateTimeField(blank=True, null=True)
completed_by = models.ForeignKey(User, blank=True, null=True)
tags = TaggableManager()
def __unicode__(self):
return self.description
Run Code Online (Sandbox Code Playgroud)
我正在尝试为项目中的所有Todos获取一个唯一标记列表,并且我已经设法使用集合理解来使其工作,但是对于项目中的每个Todo,我必须查询数据库以获取标记.我的理解是:
unique_tags = { tag.name.lower() for todo in project.todo_set.all() for tag in todo.tags.all() }
Run Code Online (Sandbox Code Playgroud)
这很好用,但是对于项目中的每个待办事项,它都会运行一个单独的查询来获取所有标记.我想知道是否有任何方法可以执行类似于prefetch_related的操作以避免这些重复的查询:
unique_tags = { tag.name.lower() for todo in project.todo_set.all().prefetch_related('tags') for tag in todo.tags.all() }
Run Code Online (Sandbox Code Playgroud)
运行前面的代码给我错误:
'tags' does not resolve to a item that supports prefetching - this is an invalid parameter to prefetch_related().
Run Code Online (Sandbox Code Playgroud)
我确实看到有人在这里问了一个非常相似的问题:优化django查询以获取外键和django-taggit关系, …
我有一个正在做日志记录的django应用程序.我的模型看起来像这样:
class MessageLog(models.Model):
logtime = models.DateTimeField(auto_now_add=True)
user = models.CharField(max_length=50)
message = models.CharField(max_length=512)
Run Code Online (Sandbox Code Playgroud)
想要做的是获取一周中每天记录的平均消息数,以便我可以看到哪些天最活跃.我设法写了一个查询,每天提取的邮件总数是:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).count()
Run Code Online (Sandbox Code Playgroud)
但是我在查询中计算平均值时遇到了麻烦.我现在拥有的是:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).annotate(num_msgs=Count('id')).aggregate(Avg('num_msgs'))
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这是每天返回1.0.我查看了它正在生成的SQL,它是:
SELECT AVG(num_msgs) FROM (
SELECT
`myapp_messagelog`.`id` AS `id`, `myapp_messagelog`.`logtime` AS `logtime`,
`myapp_messagelog`.`user` AS `user`, `myapp_messagelog`.`message` AS `message`,
COUNT(`myapp_messagelog`.`id`) AS `num_msgs`
FROM `myapp_messagelog`
WHERE DAYOFWEEK(`myapp_messagelog`.`logtime`) = 1
GROUP BY `myapp_messagelog`.`id` ORDER BY NULL
) subquery
Run Code Online (Sandbox Code Playgroud)
我认为问题可能来自GROUP BY id,但我不太确定.任何人有任何想法或建议吗?提前致谢!
我正在使用Laravel 5和Codeception,我想在我的单元测试中使用内存中的SQLite数据库,但是,我似乎无法将我的环境设置为在Codeception中"测试".我正在使用Laravel5模块,并在我的unit.suite.yml文件中定义了以下内容:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper, Laravel5]
config:
Laravel5:
environment_file: .env.testing
Run Code Online (Sandbox Code Playgroud)
我有一个.env文件,它定义了我的所有本地设置,然后是.env.testing文件,它定义了所有特定于测试的设置.但是,它似乎从未真正正确地设置环境.
为了测试我刚才做的环境:
$this->assertEquals('testing', \App::environment());
Run Code Online (Sandbox Code Playgroud)
我总是得到:
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'testing'
+'local'
Run Code Online (Sandbox Code Playgroud)
任何人都知道我做错了什么?
我正在尝试建立一个网站,其中有一个div的"旋转木马",它们都是并排(左侧浮动),每个都有一个全屏宽度.使用javascript我打算通过移动"轮播"将不同的div移动到视图中.
我的问题是,由于某种原因,当我设置溢出时:隐藏在包含轮播的div上,所有内容都被隐藏.当我用萤火虫检查时,div显示在正确的位置,但没有任何内容可见.
这是HTML:
<div id="content_window">
<div id="carousel">
<div id="p_home" class="pane">
Home!
</div>
<div id="p_about" class="pane">
About!
</div>
<div id="p_services" class="pane">
Services!
</div>
<div id="p_contact" class="pane">
Contact!
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
而CSS:
#content_window
{
position:relative;
width:100%;
overflow:hidden;
}
#carousel
{
position:absolute;
width:400%;
top:50px;
left:0;
overflow:hidden;
}
.pane
{
float:left;
width:25%;
color:White;
text-align:left;
margin-top:50px;
}
Run Code Online (Sandbox Code Playgroud)
如果我将溢出:隐藏在#content_window之外,则窗格中的内容变为可见但添加了水平滚动条,您可以滚动并查看所有窗格.有谁知道我做错了什么?