2012-09-20 63 views
0

我對這個問題的處理方式可能完全錯誤,所以請不要猶豫糾正它。我還在問題標題中添加了ATDD,因爲我試圖測試我的web api的輸出,它比單元測試更大。ATDD Google App Engine與Python - 與鍵有關的問題

我使用:

  • 谷歌App Engine的1.7.1
  • GAE高複製數據存儲
  • 的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名藝術家與artist_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/" 
     } 
    } 
} 

起初我認爲如果我啓動一個新的試驗檯每次我運行測試時,我都可以指望我的藝術家順序進入數據存儲區,因此會得到ids 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_or_name()來輸出屬性,所以一切順利,測試通過。

但是,現在當我測試一個單獨的藝術家的回報時,可以通過以下http://my_server.com/artist/5/獲得,我的測試失敗。搶藝術家出來的數據存儲,我使用下面的代碼:

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() 

任何想法?

回答

0

這裏是我使用的是現在的東西。我不喜歡它,但它應該是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 
0

也許不是您正在尋找的答案,但可以確定您是在生產服務器還是部署服務器上運行並執行不同的代碼路徑。

In Python, how can I test if I'm in Google App Engine SDK? http://code.google.com/appengine/docs/python/runtime.html#The%5FEnvironment

os.environ['SERVER_SOFTWARE'].startswith('Development') 
+0

謝謝保羅,但我寧願不根據環境分支。 – Erds

+0

夠公平的。 FYI Python 2.7.3在應用程序引擎中不受支持,僅爲2.7.2。 https://developers.google.com/appengine/docs/whatisgoogleappengine –