모의 객체와 스파이
테스트 대상 코드를 격리해 보세요.
모의 객체와 스파이은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
테스트 대역
함수가 네트워크 호출이나 로그 기록처럼 느리거나 외부적인 대상에 의존하는 경우가 있습니다. 테스트 대역은 이러한 의존성을 제어 가능한 대체 객체로 바꿉니다.
busted는 세 가지 종류를 제공합니다: 스파이, 스텁, 모의 객체입니다. 각각 서로 다른 용도로 사용됩니다.
스파이의 역할
스파이는 함수를 감싸고 원래 함수를 계속 실행하면서 호출 방식을 기록합니다. 이를 통해 어떤 대상이 호출되었는지 확인할 수 있습니다.
함수 주위에 spy.new를 사용하거나 테이블의 필드에 스파이를 설정하여 만드십시오.
local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()메서드에 스파이 설정하기
spy.on을 사용하면 기존 테이블의 메서드를 감시할 수 있습니다. 원래 메서드는 계속 실행되지만 busted가 각 호출을 추적합니다.
로거가 호출되는 것과 같은 부작용이 발생했는지 확인할 때 적합합니다.
spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()호출 횟수 확인하기
스파이는 호출된 횟수를 기록합니다. 정확한 횟수를 확인하려면 was.called(n)을 사용하십시오.
이 검사는 함수가 너무 자주 호출되거나 전혀 호출되지 않는 버그를 찾아냅니다.
assert.spy(s).was.called(2)
assert.spy(s).was_not.called()호출 인수 확인하기
was.called_with를 사용하면 스파이가 받은 인수를 확인할 수 있습니다. busted는 기록된 인수와 예상한 인수를 비교합니다.
이를 통해 함수가 실행되었는지만 아니라 올바르게 실행되었는지도 확인할 수 있습니다.
local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)스텁의 역할
스텁은 함수를 완전히 대체하므로 원래 함수가 전혀 실행되지 않습니다. 실제 네트워크나 디스크 접근처럼 느리거나 원하지 않는 작업을 건너뛸 때 사용하십시오.
테이블 필드에 stub을 사용하여 만드십시오. 기본적으로 스텁은 아무 작업도 하지 않고 nil을 반환합니다.
stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()스텁의 반환 값
returns를 사용하면 스텁이 고정된 값을 반환하도록 만들 수 있습니다. 이렇게 하면 테스트 중인 코드에 제어된 데이터를 전달할 수 있습니다.
이제 테스트가 실제 의존성에 전혀 의존하지 않습니다.
stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)모의 객체의 역할
모의 객체는 기존 테이블을 받아 모든 함수를 한 번에 스파이나 스텁으로 바꿉니다. 전체 객체를 추적할 때 편리한 방법입니다.
mock(obj)을 호출하여 테이블을 감싼 다음 개별 메서드를 확인하십시오.
local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()스텁 메서드를 사용하는 모의 객체
mock에 두 번째 인수로 true를 전달하면 모든 메서드가 스텁으로 대체되므로 원래 메서드는 실행되지 않습니다. 이렇게 하면 객체를 완전히 격리할 수 있습니다.
실제 메서드에 피해야 할 부작용이 있을 때 사용하십시오.
local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())대역 객체 복원하기
스파이, 스텁, 모의 객체는 공유 테이블을 변경하므로 반드시 복원해야 합니다. 그렇지 않으면 이후 테스트가 해당 대역 객체를 보게 됩니다. :revert() 또는 mock.revert를 호출하십시오.
테스트 사이에 항상 깨끗한 상태를 유지하려면 복원 작업을 after_each에 넣으십시오.
after_each(function()
mock.revert(m)
end)적절한 대역 객체 선택
실제 함수를 관찰하려면 스파이를, 함수를 제어된 동작으로 바꾸려면 스텁을, 전체 객체를 한 번에 감싸려면 모의 객체를 사용하십시오.
목적을 달성하는 데 필요한 가장 가벼운 대역 객체를 우선 사용하십시오. 모의 객체를 지나치게 사용하면 테스트가 취약해지고 실제 버그가 숨겨질 수 있습니다.
describe("mailer", function()
it("sends once", function()
local s = spy.on(smtp, "send")
mailer.notify("a@b.com")
assert.spy(s).was.called(1)
end)
end)빠른 확인
busted 테스트 대역에 대한 이해도를 확인해 보십시오.
복습
테스트 대역은 느리거나 외부적인 의존성으로부터 코드를 격리합니다. 스파이는 원래 함수를 실행하면서 호출을 기록하고, 스텁은 함수를 제어된 동작으로 대체하며, 모의 객체는 전체 객체를 감쌉니다.
was.called와 was.called_with로 확인하고, 테스트가 서로 격리되도록 항상 after_each에서 revert로 대역 객체를 복원하십시오.
AI 튜터와 함께 Lua을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 40
- 레슨
- 159
자주 묻는 질문
“모의 객체와 스파이” 강의는 무료인가요?
네 — “모의 객체와 스파이” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“모의 객체와 스파이”에서 뭘 배우나요?
테스트 대상 코드를 격리해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“모의 객체와 스파이” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 테스트가 필요한 이유
- describe와 it 블록
- 검증
- 모의 객체와 스파이