小编bb8*_*b89的帖子

Laravel测试 - 与Mockery一起抛出异常

我对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()方法?如果有人能够了解正在发生的事情,那将非常感激.

提前致谢!

php unit-testing laravel mockery

8
推荐指数
1
解决办法
4745
查看次数

Django-taggit prefetch_related

我正在构建一个基本的时间记录应用程序,我有一个使用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 django-taggit

7
推荐指数
2
解决办法
1595
查看次数

Django汇总每天的记录数

我有一个正在做日志记录的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,但我不太确定.任何人有任何想法或建议吗?提前致谢!

python django orm

7
推荐指数
2
解决办法
7886
查看次数

Laravel 5测试环境未在Codeception单元测试中设置

我正在使用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)

任何人都知道我做错了什么?

php unit-testing laravel codeception laravel-5

7
推荐指数
1
解决办法
2588
查看次数

设置溢出:隐藏在父级上隐藏所有内容

我正在尝试建立一个网站,其中有一个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之外,则窗格中的内容变为可见但添加了水平滚动条,您可以滚动并查看所有窗格.有谁知道我做错了什么?

html css css-float

3
推荐指数
1
解决办法
3626
查看次数