我有一个源代码打开一个csv文件并设置一个标头值关联.源代码如下:
def ParseCsvFile(source):
"""Parse the csv file.
Args:
source: file to be parsed
Returns: the list of dictionary entities; each dictionary contains
attribute to value mapping or its equivalent.
"""
global rack_file
rack_type_file = None
try:
rack_file = source
rack_type_file = open(rack_file) # Need to mock this line.
headers = rack_type_file.readline().split(',')
length = len(headers)
reader = csv.reader(rack_type_file, delimiter=',')
attributes_list=[] # list of dictionaries.
for line in reader:
# More process to happeng. Converting the rack name to sequence.
attributes_list.append(dict((headers[i],
line[i]) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试我是否正确地转换了从第三方 api 返回的数据。我在使用 Mox 时遇到了一些麻烦,因为我需要在数据转换期间点击两个单独的端点。让我通过发布代码更清楚地解释:
test "players/0 return all active players" do
Statcasters.SportRadarNbaApi.ClientMock
|> expect(:league_hierarchy, fn ->
{:ok, league_hierarchy_map()}
end)
Statcasters.SportRadarNbaApi.ClientMock
|> expect(:team_profile, fn _ ->
{:ok, team_profile_map()}
end)
assert Statcasters.Sports.Nba.get_players() == ["Kevon Looney", "Patrick McCaw"]
end
Run Code Online (Sandbox Code Playgroud)
def get_players do
with {:ok, hierarchy} <- @sport_radar_nba_api.league_hierarchy,
team_ids <- get_team_ids(hierarchy),
players <- get_team_players(team_ids)
do
IO.inspect players
end
end
defp get_team_players(team_ids) do
for team_id <- team_ids do
{:ok, team} = @sport_radar_nba_api.team_profile(team_id)
end
end
Run Code Online (Sandbox Code Playgroud)
忽略编写的代码实际上不会通过测试的事实。这是我试图弄清楚的测试失败。
第二个 api 调用team_profile
在测试中被调用两次,因为我遍历了两次,team_ids …
在我的应用程序中,每个模型都有一个类来保存常用的查询(我猜它在某种程度上是DDD语言中的"存储库").这些类中的每一个都传递给SQLAlchemy会话对象,以便在构造时创建查询.我在确定在单元测试中运行某些查询的最佳方法时遇到了一些困难.使用无处不在的博客示例,假设我有一个"Post"模型,其中包含列和属性"date"和"content".我还有一个"PostRepository",其方法是"find_latest",它应该按"日期"降序查询所有帖子.它看起来像:
from myapp.models import Post
class PostRepository(object):
def __init__(self, session):
self._s = session
def find_latest(self):
return self._s.query(Post).order_by(Post.date.desc())
Run Code Online (Sandbox Code Playgroud)
我在模拟Post.date.desc()调用时遇到了麻烦.现在我在单元测试中为Post.date.desc修补了一个模拟,但我觉得可能有更好的方法.
编辑:我正在使用mox作为模拟对象,我当前的单元测试看起来像:
import unittest
import mox
class TestPostRepository(unittest.TestCase):
def setUp(self):
self._mox = mox.Mox()
def _create_session_mock(self):
from sqlalchemy.orm.session import Session
return self._mox.CreateMock(Session)
def _create_query_mock(self):
from sqlalchemy.orm.query import Query
return self._mox.CreateMock(Query)
def _create_desc_mock(self):
from myapp.models import Post
return self._mox.CreateMock(Post.date.desc)
def test_find_latest(self):
from myapp.models.repositories import PostRepository
from myapp.models import Post
expected_result = 'test'
session_mock = self._create_session_mock()
query_mock = self._create_query_mock()
desc_mock = self._create_desc_mock()
# Monkey patch
tmp …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试用Python模拟open()内置方法进行测试.但是,我总是得到一个崩溃和这个结果消息:
File "/opt/home/venv/lib/python2.7/site-packages/nose-1.3.0-py2.7.egg/nose/result.py", line 187, in _exc_info_to_string
return _TextTestResult._exc_info_to_string(self, err, test)
File "/opt/python-2.7.3/lib/python2.7/unittest/result.py", line 164, in _exc_info_to_string
msgLines = traceback.format_exception(exctype, value, tb)
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 141, in format_exception
list = list + format_tb(tb, limit)
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 76, in format_tb
return format_list(extract_tb(tb, limit))
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 101, in extract_tb
line = linecache.getline(filename, lineno, f.f_globals)
File "/opt/home/venv/lib/python2.7/linecache.py", line 14, in getline
lines = getlines(filename, module_globals)
File "/opt/home/venv/lib/python2.7/linecache.py", line 40, in getlines
return updatecache(filename, module_globals)
File "/opt/home/venv/lib/python2.7/linecache.py", line 127, in updatecache
with …
Run Code Online (Sandbox Code Playgroud) 我有一节课:
class MyClass(object):
@property
def myproperty(self):
return 'hello'
Run Code Online (Sandbox Code Playgroud)
使用mox
和py.test
,我如何模拟myproperty
?
我试过了:
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty = 'goodbye'
Run Code Online (Sandbox Code Playgroud)
和
mock.StubOutWithMock(myclass, 'myproperty')
myclass.myproperty.AndReturns('goodbye')
Run Code Online (Sandbox Code Playgroud)
但都失败了AttributeError: can't set attribute
.
我正在尝试创建一个帮助函数来读取文件并模拟单元测试的所有导入.我必须读取文件vs import,因为我在python路径上没有这些东西.
示例代码:
#module.py
import com.stackoverflow.question
from com.stackoverflow.util import test_func
from com.stackoverflow.util import TestClass
Run Code Online (Sandbox Code Playgroud)
#magic helper: what i want
magic = process('<path_to>/module.py')
for module in magic.modules_as_strings():
#todo would have to recuirsively add each path
# so i would first create com, then com.stackoverflow, etc
setattr(self, module, StubModules(module)
for obj in magic.sink:
#these would be "from" from x import Y
#its basically just creating self.Y = object
setattr(self, object)
Run Code Online (Sandbox Code Playgroud)
上面是模拟代码,我真的在寻找将文件标记为"from/import语句"的最佳方法
有道理?我知道我可以逐行阅读文件,但我希望有一个更清洁/简洁的方式.
如果您有任何疑问,请告诉我.
我有一个函数A,可以多次调用另一个函数B. 我想以这样的方式模拟B,即任何数量的具有正确数量的参数的调用,无论值如何,都将返回固定的值并被视为正确.
调用函数的次数或次数不是规范的一部分.
我有一个方法可以调用其他两个方法.
def main_method(self, query):
result = self.method_one(query)
count = self.method_two(result)
return count
def method_one(self, query):
#Do some stuff based on results.
#This method hits the database.
return result
def method_two(self, result):
#Do some stuff based on result.
#This method also hits the database.
return count
Run Code Online (Sandbox Code Playgroud)
我在单元测试方面经验不足,从未与Mocks和Stubs合作过.
我不太确定如何为我的第一个方法创建单元测试.由于method_one和method_two多次访问数据库并且它们非常昂贵,因此我决定使用mox创建模拟或存根以消除命中数据库的需要.
如果有经验的Mocks和Stubs的经验给我一些关于在我的案例中使用模拟和存根的提示,我将非常感激.
我正在尝试编写一个 mox 测试来读取电子表格(4 列)、获取提要并将特定列(2 列)写入 CSV 文件。我试图完成第一步,即获取列表提要,我的代码如下:
class SpreadsheetReader(mox.MoxTestBase):
def setUp(self):
mox.MoxTestBase.setUp(self)
self.mock_gclient = self.mox.CreateMock(
gdata.spreadsheet.service.SpreadsheetsService)
self.mock_spreadsheet_key = 'fake_spreadsheet_key'
self.mock_worksheet_id = 'default'
self.test_data = [{'str_col':'col1', 'str_col':'col2', 'str_col':'col13'}]
def testGetFeed(self):
self.mock_gclient.GetListFeed(self.mock_spreadsheet_key,
self.mock_worksheet_id).AndReturn(self.test_data)
self.mox.ReplayAll()
self.mox.Verify()
def tearDown(self):
mox.MoxTestBase.tearDown(self)
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到以下错误:
ExpectedMethodCallsError: Verify: Expected methods never called:
0. SpreadsheetsService.GetListFeed('fake_spreadsheet_key', 'default') -> [{'str_col': 'col13'}]
Run Code Online (Sandbox Code Playgroud)
知道如何修复这个错误吗?
mox ×9
python ×8
mocking ×4
unit-testing ×4
elixir ×1
properties ×1
python-2.7 ×1
sqlalchemy ×1
stubs ×1