2014-10-14 5 views
1

자동화 테스트를 위해 아래 테스트 구조가 있습니다.NoMethodError : 정의되지 않은 메소드 'assert_equal'with minitest

#/project/class/Calculator.rb 

require 'TestModule' 
require 'MathOperation' 

class Calculator 
    include TestModule 
    include MathOperation 

    def initialize(num1, num2) 
    @num1 = num1 
    @num2 = num2 
    end 
end 


#/project/methods/MathOperation.rb 

module MathOperation 
    def operation_addition 
     addition = @num1 + @num2 
     return addition 
    end 
end 


#/project/methods/TestModule.rb 

module TestModule 
    def test_addition(value) 
     assert_equal 25, value 
    end 
end 


#/project/tescases/TestCalculator.rb 

require 'minitest/autorun' 
require 'calculator' 

class TestCalculator < Minitest::Test 

    def setup 
    @calc = Calculator.new(15, 10) 
    end 

    def test_proper_addition 
    resolution = @calc.operation_addition 
    @calc.test_addition(resolution) 
    end 
end 

테스트 클래스 TestCalculator를 실행할 때이 오류가 발생합니다. 내가 클래스 TestCalculatorassert_equal 방법을 사용하는 경우

NoMethodError: undefined method 'assert_equal' for #<Calculator:0x00000002a77518 @num1=15, @num2=10

그것은했다. 그러나이 방법은 장래의 긴 테스트 케이스 및 중복 된 코드에서 발생할 수 있습니다. minitest 클래스에서 호출하는 모듈에서 "어설 션"을 어떻게 사용할 수 있습니까? 가능한가?

+0

내가 당신의 디자인을 이해하지 않는,하지만 난 당신의 테스트 코드가 완전히 비 - 테스트 코드로부터 분리되어야한다고 말할 수 있습니다 : TestCalculator이 어서 트를 수행하면서, Calculator가 모든 일을하자. 예 : 'Calculator'는'TestModule'을 포함해서는 안됩니다. – Max

+0

정확히 어떤 것이 분리되어 있는지 확실하지 않습니다. 그러나'Calculator'에서'TestModule'을 제거하면'TestModule'에서'Calculator' 객체로 메소드를 호출 할 수 없습니다. 내 문제는 모듈'TestModule' assert 메서드를 사용할 수 없다는 것입니다. 하지만 나는 루비 전문가가 아니며 어쩌면 내 디자인이 완전히 틀렸다. – user3483829

답변

2

문제는 모두 TestModule 모듈에서 발생합니다. 이 모듈의 의미는 다른 모든 코드를 컨텍스트에서 이해하기 만하면 분명합니다. 이는 캡슐화 원칙을 맹렬히 위반하는 것입니다. 가치 25가 중요한 이유는 무엇입니까? 코드가 동등 함을 표명하고 추가를 수행하지 않을 때 메서드가 test_addition 인 이유는 무엇입니까? 해당 모듈을 완전히 제거하십시오.

그런 다음 minitest documentation의 예를보고 사용법을 확인하십시오.

# no testing code here, just functionality 

module MathOperation 
    def operation_addition 
    addition = @num1 + @num2 
    end 
end 

class Calculator 
    include MathOperation 

    def initialize(num1, num2) 
    @num1 = num1 
    @num2 = num2 
    end 
end 

# and now we do all of the testing stuff 

require 'minitest/autorun' 

class TestCalculator < Minitest::Unit::TestCase 
    def setup 
    @calc = Calculator.new(15, 10) 
    end 

    def test_addition 
    assert_equal 25, @calc.operation_addition 
    end 
end 
+0

내 구조에서 테스트 된 파트로 모듈을 사용할 수 없다는 뜻입니까? 이것은 내 문제를 설명하고자하는 아주 간단한 예입니다. 웹 페이지의 자동화 테스트에'minitest'를 사용하고 싶습니다. 제안한대로 사용하면 프레임 워크 유지 관리가 매우 어려워지고 테스트 케이스에 많은 양의 줄이 생깁니다. 그래서 결과의 테스트를 특정 모듈의 특정 메소드로 분리하고 싶습니다. – user3483829

+0

원하는 경우 테스트 방법을 모듈에 넣을 수 있습니다. 단지 'Calculator'가 아닌'TestCalculator'에 모듈을 포함하십시오. – Max

+0

'TestCalculator'에'Include TestMethod'를 추가했지만 현재 두 가지 오류가 있습니다. 첫 번째는 위에서 설명한 것과 동일하고 두 번째는 다음과 같습니다.'TestCalculator # test_addition :' 'ArgumentError : 잘못된 인수 수 (0 for 1)'그러나 적절한 수의 인수가 있습니다. – user3483829