标签: mox

在单元测试中模拟打开(file_name)

我有一个源代码打开一个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)

python unit-testing mox

24
推荐指数
4
解决办法
3万
查看次数

使用 Mox 测试函数链中的多个 API 调用

我正在尝试测试我是否正确地转换了从第三方 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 …

elixir mox

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

Python SQLAlchemy - 模拟模型属性的"desc"方法

在我的应用程序中,每个模型都有一个类来保存常用的查询(我猜它在某种程度上是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 unit-testing sqlalchemy mocking mox

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

AttributeError:__ exit__当我试图模拟构建函数时

我目前正在尝试用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)

python unit-testing mocking mox

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

如何使用mox模拟类属性?

我有一节课:

class MyClass(object):
    @property
    def myproperty(self):
        return 'hello'
Run Code Online (Sandbox Code Playgroud)

使用moxpy.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.

python properties mocking mox

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

Python从py模块读取所有import语句的简便方法

我正在尝试创建一个帮助函数来读取文件并模拟单元测试的所有导入.我必须读取文件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语句"的最佳方法

有道理?我知道我可以逐行阅读文件,但我希望有一个更清洁/简洁的方式.

如果您有任何疑问,请告诉我.

python mox python-2.7

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

如何使用Mox模拟模块函数并允许以几乎任何方式调用它

我有一个函数A,可以多次调用另一个函数B. 我想以这样的方式模拟B,即任何数量的具有正确数量的参数的调用,无论值如何,都将返回固定的值并被视为正确.

调用函数的次数或次数不是规范的一部分.

python mox

4
推荐指数
1
解决办法
4720
查看次数

模拟或存根?

我有一个方法可以调用其他两个方法.

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的经验给我一些关于在我的案例中使用模拟和存根的提示,我将非常感激.

python unit-testing mocking stubs mox

4
推荐指数
1
解决办法
1030
查看次数

运行 python mox test 时从未调用预期方法

我正在尝试编写一个 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)

知道如何修复这个错误吗?

python mox

2
推荐指数
1
解决办法
2718
查看次数