pytest测试类调用类方法,类型错误需要精确给出2个参数(只给出1个)。

8
我是一位有用的助手,可以为您翻译文本。
我有一个测试类来测试我的方法,但是我在传递self参数时遇到了一些问题,它们都在类和测试类中。
我的方法:
def get_all_links(self):
    """return all the links inside an html

    :return: list of links from an html page
    :rtype: list
    """
    return self.html.find_all('a')

我的测试用例:

    @parameterized.expand(["http://www.google.com", "http://www.walla.com"])
    def test_get_all_links_known_links(self, known_link):
        """check get_all_links with a known link list

        :param known_link: lick to find
        :type known_link: str
        """
        html = Parser(open(os.path.normpath(os.path.join(self.root, "test.html"))))

        self.assertTrue(any([known_link in str(l) for l in html.get_all_links()]))

错误:

E TypeError: test_get_all_links_known_links() takes exactly 2 arguments (1 given)

/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py:329: TypeError
...

2
实际上,你在使用nose还是pytest?你的问题标题暗示着使用pytest -- 甚至你的标签包括"pytest"。-- 到底是哪个? - James Mills
@James Mills 我正在使用pytest,但尝试与nose parameterized一起使用。 - Kobi K
2
不要混合使用两个测试框架,使用pytest的参数化和固件即可 :) - James Mills
3个回答

4

在这里你 真的 不需要继承 unittest.TestCase:

你也可以使用 pytest 来“参数化”测试:

示例:

import pytest


from app.objects import Root  # Example


known_links = [
    "http://www.google.com",
     "http://www.walla.com"
]


@pytest.fixture()
def root(request):
    return Root()  # Root object


@pytest.mark.parametrize("known_links", known_links)
def test_get_all_links_known_links(root, known_link):
    html = Parser(
        open(os.path.normpath(os.path.join(root, "test.html")))
    )

    assert any([known_link in str(l) for l in html.get_all_links()])

参见:


2

在使用装饰器之前,您需要先导入parameterized

from nose_parameterized import parameterized

哦哈哈,我没有注意到 OP 使用的是 Node 而不是 Pytest :) 糟糕!嗯,现在我也不确定了 :) - James Mills
是的,虽然如此,他实际上可能正在使用nose和unittest两者。请查看以下示例:https://github.com/wolever/nose-parameterized - chown
哦,好吧 耸肩;原帖作者没有回复我们的评论,所以让我们称之为 两个可能的解决方案) :) - James Mills
@chown 我正在导入parameterized,但我看不出来有什么用,难道py.test不能使用nose_parameterized吗? - Kobi K
@KobiK 我不确定它是否适用于 py.test。我只看到过使用 unittest。请查看我之前评论中提供的链接。它提供了许多 nose_parameterizes 与 unittest 的使用示例。 - chown
我已经尝试过了,还是出现了同样的错误。我将其放在类中使用,可能是一些愚蠢的错误。 - Kobi K

0

html.get_all_links前面加上self.

self.assertTrue(any([known_link in str(l) for l in self.html.get_all_links()]))

Python必须能够在命名空间中找到该方法。通过self(即您的对象实例),它可以找到实例命名空间中的所有条目以及其类命名空间中的所有条目等。 有关类/方法/属性/命名空间的信息,请参见此处。 还请参阅我对类似问题的答案此处


2
以上示例代码中没有"self.html"。 - James Mills
你的“编辑”并没有更好,而且令人困惑。至少要展示一个可能发生的例子。 - James Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接