小编Cla*_*ine的帖子

修补类在访问实例属性时会产生"AttributeError:Mock对象没有属性"

问题
使用mock.patchautospec=True修补一类不保存该类的实例的属性.

细节
我试图测试一个类Bar,它将类的实例实例Foo化为一个Bar被调用的对象属性foo.所述Bar被测方法被调用bar; 它调用属于fooFoo实例的方法Bar.在测试中,我在嘲笑Foo,因为我只想测试Bar访问正确的Foo成员:

import unittest
from mock import patch

class Foo(object):
    def __init__(self):
        self.foo = 'foo'

class Bar(object):
    def __init__(self):
        self.foo = Foo()

    def bar(self):
        return self.foo.foo

class TestBar(unittest.TestCase):
    @patch('foo.Foo', autospec=True)
    def test_patched(self, mock_Foo):
        Bar().bar()

    def test_unpatched(self):
        assert Bar().bar() == 'foo'
Run Code Online (Sandbox Code Playgroud)

类和方法工作得很好(test_unpatched通过),但是当我尝试在测试用例(使用nosetests和pytest测试)中使用Foo时autospec=True,遇到"AttributeError:Mock对象没有属性'foo'"

19:39 $ nosetests -sv …
Run Code Online (Sandbox Code Playgroud)

python attributes unit-testing mocking python-unittest

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

在gruntfile中执行shell脚本并将结果赋给变量

我正在使用grunt来管理一套摩卡运行测试.mocha测试套件中需要的一件事是设置某些环境变量,以便根据运行测试的开发人员的环境正确执行测试.其中一个环境变量在每个开发人员的机器上都有不同的值,因此我们执行一个bash脚本来为我们设置的环境变量返回该值.

我正在使用grunt.util.spawn来运行脚本并将其结果分配给我的gruntfile中定义的变量,然后使用grunt-env来设置具有该值的环境变量.下面是我的gruntfile示例(在coffeescript中):

module.exports = (grunt) ->
  envvar = ''

  grunt.initConfig
    pkg: grunt.file.readJSON('package.json')

    env:
      dev:
        ENV_VAR: envvar

    simplemocha:
      options:
        timeout: 30000
        reporter: 'spec'
        compilers: 'coffee:coffee-script'
      all:
        src: ['Tests/**/*.coffee']

  grunt.registerTask 'init', ->
    done = this.async
    command =
      cmd: './bin/get_envvar.sh'
    grunt.util.spawn command, (error, result, code) ->
      envvar = result
      console.log 'envvar: ' + envvar
      done

  grunt.registerTask 'test', ['init', 'env', 'simplemocha']
Run Code Online (Sandbox Code Playgroud)

要执行此操作,我打电话给...

/path/to/grunt test
Run Code Online (Sandbox Code Playgroud)

不幸的是,虽然init运行,但其中的回调似乎没有被执行,因此envvar永远不会被设置.奇怪的是,如果我在我的测试中禁用了日志记录,那么回调就会被调用,但只有在我的env和simplemocha任务被启动后才会被调用.我对grunt任务的理解是它们是阻塞的,所以我希望在继续下一个任务之前必须完成init任务(即使使用其中的异步函数).

有任何想法吗?

bash spawn node.js coffeescript gruntjs

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

在phpunit的Selenium 2 web驱动程序中,setBrowserUrl()和url()有什么区别?

在许多示例中,我看到了对webdriver-> setBrowserURL(url)和webdriver-> url(url)的调用.为什么我要使用一个而不是另一个.一个这样的例子显示以相同的方式使用两者(取自phpunit手册):

<?php
class WebTest extends PHPUnit_Extensions_Selenium2TestCase
{
    protected function setUp()
    {
        $this->setBrowser('firefox');
        $this->setBrowserUrl('http://www.example.com/');
    }

    public function testTitle()
    {
        $this->url('http://www.example.com/');
        $this->assertEquals('Example WWW Page', $this->title());
    }

}
?>
Run Code Online (Sandbox Code Playgroud)

为什么setBrowserUrl()在setup中被调用一次 - 然后在测试用例本身中使用相同的url调用url()?

在其他示例中,我看到url()仅使用url的路径调用.这里的正确用法是什么?我几乎找不到关于url()使用的文档.

selenium phpunit automated-tests selenium-webdriver

5
推荐指数
1
解决办法
1921
查看次数

未通过使用 fileConfig 配置的处理程序记录 Python 根记录器消息

问题:

给定一个日志配置和一个使用该配置的记录器,我看到来自配置日志处理程序的脚本的日志消息,但不是来自分配了相同处理程序的根记录器。

细节:

(使用 Python 2.7)

我有一个my_mod实例化记录器的模块。my_mod具有my_command使用该记录器记录一些消息的功能。my_mod存在于库中my_lib,所以我不想用任何处理程序配置记录器;按照建议,我想将日志处理留给使用my_mod. my_mod好像:

import logging

LOGGER = logging.getLogger(__name__)

def my_command():
    LOGGER.debug("This is a log message from module.py")
    print "This is a print statement from module.py"
Run Code Online (Sandbox Code Playgroud)

我还有一个 python 脚本my_script.py,它使用my_mod.my_command. my_script.py实例化一个记录器,在这种情况下,我确实配置了处理程序和格式化程序。my_script.py配置处理程序和格式化程序使用fileConfig和一个配置文件一起存在my_script.py

import os
import logging
import logging.config
from my_mod.module import my_command

logging.config.fileConfig('{0}/logging.cfg'.format(
    os.path.dirname(os.path.realpath(__file__))))
LOGGER = logging.getLogger(__name__)

LOGGER.debug("This is a log message from script.py") …
Run Code Online (Sandbox Code Playgroud)

python logging configuration-files python-2.7

5
推荐指数
1
解决办法
1858
查看次数