2017-11-11 1 views
1

테스트중인 코드에서 Generator 클래스에는 Counter 클래스의 next_count 메서드를 호출하는 두 개의 메서드가 있습니다.발전기 내에서 조롱 된 객체에 대한 호출이 올바르게 테스트되지 않는 이유는 무엇입니까?

next_count에 대한 이러한 두 건의 호출은 assert_called_with을 사용하여 거의 동일한 두 가지 테스트를 통해 테스트됩니다. 생성기 메서드의 테스트가 실패합니다. 왜? 이 호출을 어떻게 테스트 할 수 있습니까?

코드에서 테스트

generator.py

class Counter: 
    def __init__(self): 
     self.count = 1 

    def next_count(self): 
     self.count += 1 
     return self.count 


class Generator: 
    def __init__(self): 
     self.counter = Counter() 

    def direct_call(self): 
     self.counter.next_count() 

    def iter_event(self): 
     while True: 
      yield self.counter.count 
      self.counter.next_count() 

테스트 모듈

test_generator.py

import unittest 
import unittest.mock 

import generator 


class Generator(unittest.TestCase): 
    def setUp(self): 
     p = unittest.mock.patch('generator.Counter') 
     self.addCleanup(p.stop) 
     self.mock_counter = p.start() 

    def test_next_count_called_in_direct_call(self): # Passes 
     g = generator.Generator() 
     g.direct_call() 
     self.mock_counter.assert_called_with() 

    def test_next_count_called_in_iter_event(self): # Fails 
     g = generator.Generator() 
     count_gen = g.iter_event() 
     next(count_gen) 
     next(count_gen) 
     self.mock_counter.next_count.assert_called_with() 

답변

1

이 할 수 없다 발전기와. 당신은 2 가지 다른 것들을 테스트하고, 두 가지 테스트 모두에서 잘못된 것을 테스트했습니다. 클래스가 호출

def test_next_count_called_in_direct_call(self): # Passes 
    # ... 
    self.mock_counter.assert_called_with() 

이 테스트 경우 :

여러분이 개 테스트는 다른 무언가를 테스트합니다. 실제로 Counter()과 같이 호출됩니다. mock_counter클래스을 조롱했음을 기억하십시오.

def test_next_count_called_in_iter_event(self): # Fails 
    # ... 
    self.mock_counter.next_count.assert_called_with() 

이 속성은 Counter.next_count이 호출되었는지 테스트합니다. 이것은 대신 인스턴스에서 호출되기 때문에 호출되지 않았습니다.

정확한 테스트는 인스턴스에 해당 특성 가 호출되어 있는지 확인하는 것입니다

self.mock_counter.return_value.next_count.assert_called_with() 

또는

self.mock_counter().next_count.assert_called_with() 

사용이 두 테스트입니다.

mock_counter이 클래스이므로 MockCounter이라는 이름이 좋습니다.

앞으로는 모의의 mock_calls attribute을 인쇄하십시오. 대신 이라고 표시됩니다. 두 테스트 모두에 대해 다음을 인쇄합니다.

[call(), call().next_count()] 
관련 문제