3

テスト用のクラスにパッチを適用するのに問題があります。Scrapy に属するもの ( HtmlXpathSelectorクラス) にパッチを適用しようとしています。

ここにいくつかのコードがあります:

from scrapy.selector import HtmlXPathSelector
from mock import MagicMock, patch

with patch('scrapy.selector.HtmlXPathSelector') as MockHtml:
    instance = MockHtml.return_value
    instance.method.return_value = 'foo'
    example = HtmlXPathSelector()
    print type(example)
    assert example is instance
    assert example.method == 'foo'

結果は次のとおりです。

<class 'scrapy.selector.lxmlsel.HtmlXPathSelector'>
Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
AssertionError
>>>

この例は、モック ライブラリ チュートリアルのものとほぼ同じです。なぜそれが機能しないのですか?

4

2 に答える 2

7

現在のテスト コードに既にインポートされているクラスにパッチを適用しないでください。代わりに、対応するモジュール (テストしたい) のクラスにパッチを適用する必要があります。したがって、HtmlXPathSelectorが にインポートされた場合mymodule、次のようにパッチします。

with patch('mymodule.HtmlXPathSelector') as MockClass:
    ...

詳細については、パッチを適用する場所を参照してください。

編集これが本当に必要な場合は、現在のモジュールのクラスに次のパッチを適用できます。

with patch('__main__.Class') as MockClass:
于 2012-06-22T11:45:11.373 に答える
2

コード サンプルには 2 つの問題があります。1 つ目は、scrapy モジュールから HtmlXPathSelector をインポートしたことです。その後、その名前を変更します。代わりにセレクターをインポートし、そこから名前を使用します。

from scrapy import selector
from mock import MagicMock, patch

with patch('scrapy.selector.HtmlXPathSelector') as MockHtml:
    instance = MockHtml.return_value
    instance.method.return_value = 'foo'
    example = selector.HtmlXPathSelector()
    print type(example)
    assert example is instance
    assert example.method() == 'foo'

methodもう1つの問題は、メソッドを として呼び出す必要があるときに、最後の行が をチェックしていたことmethod()です。

于 2012-06-22T12:01:05.123 に答える