คำถามติดแท็ก mocking

การเยาะเย้ยและการแกล้งเป็นวิธีในการแยกรหัสหรือส่วนประกอบเพื่อให้แน่ใจว่าการทดสอบหน่วยทำงานกับหน่วยที่ทดสอบได้ของรหัสเท่านั้นโดยไม่ต้องใช้ส่วนประกอบอื่น ๆ หรือการพึ่งพาของแอปพลิเคชัน การเยาะเย้ยนั้นแตกต่างจากการแกล้งซึ่งเยาะเย้ยสามารถตรวจสอบเพื่อยืนยันผลการทดสอบ

9
การล้อเลียนตัวแปรสมาชิกของคลาสโดยใช้ Mockito
ฉันเป็นมือใหม่ในการพัฒนาและการทดสอบหน่วยโดยเฉพาะ ฉันเดาว่าความต้องการของฉันค่อนข้างง่าย แต่ฉันอยากรู้ว่าคนอื่นคิดอย่างไรกับเรื่องนี้ สมมติว่าฉันมีสองคลาสเช่นนั้น - public class First { Second second ; public First(){ second = new Second(); } public String doSecond(){ return second.doSecond(); } } class Second { public String doSecond(){ return "Do Something"; } } สมมติว่าฉันกำลังเขียน unit test เพื่อทดสอบFirst.doSecond()method อย่างไรก็ตามสมมติว่าฉันต้องการ Mock Second.doSecond()class เช่นนั้น ฉันใช้ Mockito เพื่อทำสิ่งนี้ public void …
142 java  mocking  mockito 

11
ฉันจะรับ PHPUnit MockObjects เพื่อคืนค่าต่าง ๆ ตามพารามิเตอร์ได้อย่างไร
ฉันมีวัตถุจำลอง PHPUnit ที่ส่งคืน'return value'ไม่ว่าอาร์กิวเมนต์จะเป็นอย่างไร // From inside a test... $mock = $this->getMock('myObject', 'methodToMock'); $mock->expects($this->any)) ->method('methodToMock') ->will($this->returnValue('return value')); สิ่งที่ฉันต้องการจะทำคือคืนค่าที่แตกต่างกันตามอาร์กิวเมนต์ที่ส่งไปยังเมธอด mock ฉันลองทำสิ่งที่ชอบแล้ว: $mock = $this->getMock('myObject', 'methodToMock'); // methodToMock('one') $mock->expects($this->any)) ->method('methodToMock') ->with($this->equalTo('one')) ->will($this->returnValue('method called with argument "one"')); // methodToMock('two') $mock->expects($this->any)) ->method('methodToMock') ->with($this->equalTo('two')) ->will($this->returnValue('method called with argument "two"')); แต่สิ่งนี้ทำให้ PHPUnit บ่นหากไม่มีการจำลองด้วยอาร์กิวเมนต์'two'ดังนั้นฉันคิดว่าคำจำกัดความของการmethodToMock('two')เขียนทับคำจำกัดความของคำแรก ดังนั้นคำถามของฉันคือ: มีวิธีการรับวัตถุ PHPUnit …

3
วิธีการจำลอง Moq โดยไม่ระบุพารามิเตอร์อินพุต
ฉันมีรหัสบางอย่างในการทดสอบโดยใช้ Moq: public class Invoice { ... public bool IsInFinancialYear(FinancialYearLookup financialYearLookup) { return InvoiceDate >= financialYearLookup.StartDate && InvoiceDate <= financialYearLookup.EndDate; } ... } ในการทดสอบหน่วยฉันพยายามล้อเลียนวิธีนี้และทำให้มันกลับมาเป็นจริง mockInvoice.Setup(x => x.IsInFinancialYear()).Returns(true); IsInFinancialYearอย่างไรก็ตามมีการเขียนบรรทัดนี้ดังนั้นผมจึงไม่ได้มีการระบุการป้อนข้อมูลเพื่อ กล่าวคือ. ดังนั้นมันจึงไม่อยู่ในโค้ดว่าพารามิเตอร์อินพุตคืออะไรมันจะคืนค่าจริงตามที่ส่งผ่านไป?
138 c#  mocking  moq 

16
ข้อมูลแบบสุ่มในการทดสอบหน่วย
ฉันมีเพื่อนร่วมงานที่เขียนการทดสอบหน่วยสำหรับวัตถุที่กรอกข้อมูลในฟิลด์ด้วยข้อมูลแบบสุ่ม เหตุผลของเขาคือให้การทดสอบที่กว้างกว่าเนื่องจากมันจะทดสอบค่าที่แตกต่างกันมากมายในขณะที่การทดสอบปกติจะใช้ค่าคงที่เดียวเท่านั้น ฉันได้ให้เหตุผลหลายอย่างกับเขาในเรื่องนี้เหตุผลหลักคือ: ค่าสุ่มหมายความว่าการทดสอบไม่สามารถทำซ้ำได้อย่างแท้จริง (ซึ่งหมายความว่าหากการทดสอบสามารถล้มเหลวแบบสุ่มได้ก็สามารถทำได้บนเซิร์ฟเวอร์การสร้างและการทำลายโครงสร้าง) ถ้ามันเป็นค่าสุ่มและการทดสอบล้มเหลวเราจำเป็นต้อง a) แก้ไขวัตถุและ b) บังคับให้เราทดสอบค่านั้นทุกครั้งเพื่อให้เรารู้ว่ามันใช้งานได้ แต่เนื่องจากเป็นการสุ่มเราจึงไม่ทราบว่าค่านั้นคืออะไร เพื่อนร่วมงานอีกคนที่เพิ่ม: หากฉันกำลังทดสอบข้อยกเว้นค่าสุ่มจะไม่ทำให้แน่ใจว่าการทดสอบสิ้นสุดลงในสถานะที่คาดหวัง ข้อมูลแบบสุ่มใช้สำหรับการชะล้างระบบและทดสอบโหลดไม่ใช่สำหรับการทดสอบหน่วย ใครสามารถเพิ่มเหตุผลเพิ่มเติมที่ฉันสามารถให้เขาเพื่อให้เขาหยุดทำสิ่งนี้ได้หรือไม่? (หรืออีกวิธีหนึ่งนี่เป็นวิธีที่ยอมรับได้ในการเขียนการทดสอบหน่วยและฉันและเพื่อนร่วมงานคนอื่น ๆ ของฉันผิดหรือเปล่า?)

6
ยืนยันว่าฟังก์ชัน / วิธีการไม่ได้ถูกเรียกโดยใช้ Mock
ฉันใช้ไลบรารีจำลองเพื่อทดสอบแอปพลิเคชันของฉัน แต่ฉันต้องการยืนยันว่าไม่ได้เรียกใช้ฟังก์ชันบางอย่าง เอกสารจำลองพูดคุยเกี่ยวกับวิธีการเช่นmock.assert_called_withและmock.assert_called_once_withแต่ฉันไม่พบอะไรที่เหมือนmock.assert_not_calledหรือสิ่งที่เกี่ยวข้องกับการตรวจสอบการเยาะเย้ยถูกไม่ได้เรียกว่า ฉันสามารถไปกับสิ่งต่อไปนี้แม้ว่ามันจะดูไม่เท่หรือไม่พีโธนิก: def test_something: # some actions with patch('something') as my_var: try: # args are not important. func should never be called in this test my_var.assert_called_with(some, args) except AssertionError: pass # this error being raised means it's ok # other stuff มีความคิดอย่างไรที่จะทำสิ่งนี้ให้สำเร็จ?

7
การล้อเลียนกับการสอดแนมในกรอบการล้อเลียน
ในกรอบการเยาะเย้ยคุณสามารถล้อเลียนวัตถุหรือสอดแนมได้ อะไรคือความแตกต่างระหว่างทั้งสองและเมื่อใดที่ฉันจะ / ควรใช้อีกอันหนึ่ง? ตัวอย่างเช่นเมื่อมองไปที่Mockitoฉันเห็นสิ่งที่คล้ายกันถูกทำโดยใช้สายลับและล้อเลียนแต่ฉันไม่แน่ใจว่าความแตกต่างระหว่างสองสิ่งนี้

7
ฉันจะจำลองการอ้างอิงสำหรับการทดสอบหน่วยใน RequireJS ได้อย่างไร
ฉันมีโมดูล AMD ที่ฉันต้องการทดสอบ แต่ฉันต้องการจำลองการอ้างอิงแทนการโหลดการอ้างอิงจริง ฉันใช้ requirejs และรหัสสำหรับโมดูลของฉันมีลักษณะดังนี้: define(['hurp', 'durp'], function(Hurp, Durp) { return { foo: function () { console.log(Hurp.beans) }, bar: function () { console.log(Durp.beans) } } } ฉันจะเยาะเย้ยออกhurpและdurpเพื่อให้ฉันได้อย่างมีประสิทธิภาพการทดสอบหน่วย?

5
การเปรียบเทียบระหว่าง Mockito กับ JMockit - ทำไม Mockito ถึงได้รับการโหวตว่าดีกว่า JMockit? [ปิด]
ตามที่กล่าวไว้ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ผมตรวจสอบที่เยาะเย้ยกรอบที่จะใช้สำหรับโครงการของฉันและได้แคบลงไปJMockitและMockito ฉันสังเกตว่าMockitoได้รับการโหวตให้เป็น " กรอบงานจำลองที่ดีที่สุดสำหรับ Java " ใน Stackoverflow ในการเปรียบเทียบในลักษณะJMockitของ ' Mocking เครื่องมือเปรียบเทียบเมทริกซ์ ' ก็ปรากฏว่าJMockitมีคุณสมบัติที่แตกต่างกันหลาย ใครมีข้อมูลเฉพาะ (ไม่แสดงความคิดเห็น) เกี่ยวกับสิ่งที่Mockitoสามารถทำได้ซึ่งไม่สามารถทำได้ด้วยJMockitและในทางกลับกัน?

2
Mockito Matchers ทำงานอย่างไร?
Mockito matchers อาร์กิวเมนต์ (เช่นany, argThat, eq, sameและArgumentCaptor.capture()) มีพฤติกรรมแตกต่างกันมากจาก matchers Hamcrest ตัวจับคู่ Mockito มักทำให้เกิด InvalidUseOfMatchersException แม้ว่าจะอยู่ในโค้ดที่ดำเนินการนานหลังจากใช้ตัวจับคู่ก็ตาม ตัวจับคู่ Mockito มองเห็นกฎแปลก ๆ เช่นกำหนดให้ใช้ Mockito matchers สำหรับอาร์กิวเมนต์ทั้งหมดเท่านั้นหากอาร์กิวเมนต์หนึ่งในวิธีการที่กำหนดใช้ตัวจับคู่ Mockito matchers สามารถทำให้เกิด NullPointerException เมื่อแทนที่Answers หรือเมื่อใช้(Integer) any()ฯลฯ การปรับโครงสร้างโค้ดด้วยตัวจับคู่ Mockito ในบางวิธีอาจทำให้เกิดข้อยกเว้นและพฤติกรรมที่ไม่คาดคิดและอาจล้มเหลวทั้งหมด เหตุใด Mockito matchers จึงได้รับการออกแบบเช่นนี้และมีการใช้งานอย่างไร?
122 java  mocking  mockito 

1
การจำลองฟังก์ชันเพื่อเพิ่มข้อยกเว้นเพื่อทดสอบบล็อกยกเว้น
ฉันมีฟังก์ชัน ( foo) ซึ่งเรียกใช้ฟังก์ชันอื่น ( bar) หากเรียกใช้การbar()เพิ่มHttpErrorฉันต้องการจัดการเป็นพิเศษหากรหัสสถานะคือ 404 มิฉะนั้นจะเพิ่มอีกครั้ง ฉันพยายามที่จะเขียนทดสอบหน่วยบางรอบนี้ฟังก์ชั่นการเยาะเย้ยออกมาเรียกร้องให้foo bar()น่าเสียดายที่ฉันไม่สามารถรับการเรียกร้องที่เยาะเย้ยbar()ให้เพิ่มข้อยกเว้นซึ่งถูกexceptบล็อกของฉันได้ นี่คือรหัสของฉันที่แสดงถึงปัญหาของฉัน: import unittest import mock from apiclient.errors import HttpError class FooTests(unittest.TestCase): @mock.patch('my_tests.bar') def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock): barMock.return_value = True result = foo() self.assertTrue(result) # passes @mock.patch('my_tests.bar') def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock): barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found') result = foo() self.assertIsNone(result) # …

5
วิธีการจำลอง phpunit การโทรหลายครั้งพร้อมอาร์กิวเมนต์ที่แตกต่างกัน
มีวิธีใดในการกำหนดการจำลองที่แตกต่างกันสำหรับอาร์กิวเมนต์อินพุตที่แตกต่างกันหรือไม่? ตัวอย่างเช่นฉันมีคลาสเลเยอร์ฐานข้อมูลที่เรียกว่า DB คลาสนี้มีเมธอดที่เรียกว่า "Query (string $ query)" ซึ่งเมธอดนั้นใช้สตริงเคียวรี SQL ในอินพุต ฉันสามารถสร้างการจำลองสำหรับคลาสนี้ (DB) และตั้งค่าการส่งคืนที่แตกต่างกันสำหรับการเรียกวิธีการสอบถามที่แตกต่างกันซึ่งขึ้นอยู่กับสตริงแบบสอบถามอินพุตได้หรือไม่
117 php  mocking  phpunit 

2
ล้อเลียนชั้นเรียน: Mock () หรือ patch ()?
ฉันใช้การเยาะเย้ยกับ Python และสงสัยว่าสองวิธีนี้ดีกว่า (อ่าน: pythonic เพิ่มเติม) วิธีที่หนึ่ง : เพียงสร้างวัตถุจำลองและใช้สิ่งนั้น รหัสมีลักษณะดังนี้: def test_one (self): mock = Mock() mock.method.return_value = True self.sut.something(mock) # This should called mock.method and checks the result. self.assertTrue(mock.method.called) วิธีที่สอง : ใช้โปรแกรมแก้ไขเพื่อสร้างภาพจำลอง รหัสมีลักษณะดังนี้: @patch("MyClass") def test_two (self, mock): instance = mock.return_value instance.method.return_value = True self.sut.something(instance) # This should called …

10
วิธีการสอดแนมบนคุณสมบัติมูลค่า (แทนที่จะเป็นวิธีการ) ด้วยจัสมิน
จัสมินspyOnเป็นสิ่งที่ดีในการเปลี่ยนพฤติกรรมของวิธีการ แต่มีวิธีใดในการเปลี่ยนคุณสมบัติค่า (แทนที่จะเป็นวิธีการ) สำหรับวัตถุหรือไม่? รหัสอาจเป็นดังนี้: spyOn(myObj, 'valueA').andReturn(1); expect(myObj.valueA).toBe(1);

7
การใส่ล้อเลียนลงในบริการ AngularJS
ฉันมีบริการ AngularJS ที่เขียนไว้และฉันต้องการทดสอบหน่วย angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']). factory('myService', function ($http, fooService, barService) { this.something = function() { // Do something with the injected services }; return this; }); ไฟล์ app.js ของฉันได้ลงทะเบียนสิ่งเหล่านี้: angular .module('myApp', ['fooServiceProvider','barServiceProvider','myServiceProvider'] ) ฉันสามารถทดสอบว่า DI ทำงานได้ดังนี้: describe("Using the DI framework", function() { beforeEach(module('fooServiceProvider')); beforeEach(module('barServiceProvider')); beforeEach(module('myServiceProvder')); var service; beforeEach(inject(function(fooService, barService, …

3
ฉันจะตรวจสอบได้อย่างไรว่าเมธอดถูกเรียกด้วย Moq เพียงครั้งเดียว
ฉันจะตรวจสอบได้อย่างไรว่าเมธอดถูกเรียกด้วย Moq เพียงครั้งเดียว Verify()เทียบกับVerifable()สิ่งที่เป็นจริงที่ทำให้เกิดความสับสน
112 .net  mocking  moq 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.