Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ATDD带Python的Google应用程序引擎-按键有问题_Python_Unit Testing_Google App Engine - Fatal编程技术网

ATDD带Python的Google应用程序引擎-按键有问题

ATDD带Python的Google应用程序引擎-按键有问题,python,unit-testing,google-app-engine,Python,Unit Testing,Google App Engine,我对这个问题的看法可能是完全错误的,所以请不要犹豫改正它。我还在问题标题中添加了ATDD,因为我正在尝试测试我的web api的输出,它比一个单元测试更大 我正在使用: 谷歌应用引擎1.7.1 高复制数据存储 Python 2.7.3 我使用样板代码设置测试: self.testbed = testbed.Testbed() self.testbed.activate() self.policy = datastore_stub_util.PseudoRandomHRConsistencyP

我对这个问题的看法可能是完全错误的,所以请不要犹豫改正它。我还在问题标题中添加了ATDD,因为我正在尝试测试我的web api的输出,它比一个单元测试更大

我正在使用:

  • 谷歌应用引擎1.7.1
  • 高复制数据存储
  • Python 2.7.3
我使用样板代码设置测试:

self.testbed = testbed.Testbed()
self.testbed.activate()
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)
self.testbed.init_datastore_v3_stub()
然后我调用一个模拟对象设置来设置我的实体,并将它们持久化到测试床数据存储中。我使用计数器添加5位艺术家id为1-5的艺术家:

def add_mock_artist_with(self, artist_id, link_id, name):
    new_artist = dto.Artist(key_name=str(artist_id),
        name=name,
        link_id= str(link_id))
    new_artist.put()
我的测试是我的web api返回:

{
    "artists": [
            {
            "artist": {
                "name": "Artist 1",
                "links": {
                    "self": {
                        "href": "https://my_server.com/artist/1/"
                    }
                }
            }
        },
.
.
.      
            {
            "artist": {
                "name": "Artist 5",
                "links": {
                    "self": {
                        "href": "https://my_server.com/artist/5/"
                    }
                }
            }
        }
    ],
    "links": {
        "self": {
            "href": "https://my_server.com/artists/"
        }
    }
}
最初我认为,如果每次运行测试时都启动一个新的测试台,我可以指望我的美工人员按顺序进入数据存储,因此会得到ID 1-5。我的测试最初通过了,但随着时间的推移,由于ID不匹配,测试开始失败(我会得到一个类似“href”的链接):https://my_server.com/artist/78/"). 依赖于按顺序生成ID,我感到有点内疚,所以我决定修复它。我偶然发现了密钥是名称或生成的id的概念。我更新了我的模板,以供返回的JSON使用:

artist.key().id_or_name()
在模拟对象的情况下,我在构造时提供了键名,包括:

key_name=str(artist_id) 
对于非模拟构造,我没有包含这行代码,而是让GAE分配id

由于我的模板使用key().id_或_name()输出属性,所以一切顺利,测试通过

然而,现在当我测试一位艺术家的回归时,我的测试失败了。为了从数据存储中抓取艺术家,我使用以下代码:

def retrieve_artist_by(id):
    artist = dto.Artist.get_by_id()
在生产中,这将很好地工作,因为它都是基于id的。但是,在我的测试中,它没有找到任何东西,因为我在模拟构造中使用了key_name=str(artist_id),并且名称与id不同

我希望得到类似的东西:

artist = dto.Artist.get_by_id_or_name()

有什么想法吗?

也许不是您要寻找的答案,但是可以确定您是否在生产或部署服务器上运行,并执行不同的代码路径


这是我现在正在使用的。我不喜欢它,但它应该在prod中执行,因为我将使用生成的ID。在测试中,若它并没有按id找到它,它将尝试按名称查找

def retrieve_artist_by(id):
    artist = dto.Artist.get_by_id(id)

    if artist is None:
        artist = dto.Artist.get_by_key_name(str(id))


    return artist

谢谢保罗,但我不想脱离环境,这很公平。仅供参考,应用程序引擎中不支持Python 2.7.3,仅支持2.7.2。
def retrieve_artist_by(id):
    artist = dto.Artist.get_by_id(id)

    if artist is None:
        artist = dto.Artist.get_by_key_name(str(id))


    return artist