Stub, Mock và Fake trong unit test

Chúng tôi vui mừng chia sẻ kiến thức về từ khóa Stub la gi và hy vọng rằng nó sẽ hữu ích cho bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa này trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với các chiến lược và công cụ hữu ích. Hy vọng rằng thông tin mà chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Xin chân thành cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật những kiến thức mới nhất.

Cả ba khái niệm Stub, MockFake thường rất quan trọng trong unit test và gắn liền với khái niệm về “de-coupled” architecture design. “de-coupling” architecture có mục tiêu đó là thiết kế phần mềm sao cho tất cả chúng ta có thể tách phần mềm ra thành các phần riêng biệt (các unit) mà không bị ảnh hưởng tác động bởi các phần khác hoặc chỉ bị ảnh hưởng tác động một cách tối thiểu.

Bạn Đang Xem: Stub, Mock và Fake trong unit test

1. Mock là gì?

Mock object (MO) là một đối tượng người dùng ảo mô phỏng các tính chất và hành vi y chang như đối tượng người dùng thực được truyền vào bên trong khối mã đang vận hành nhằm kiểm tra tính đúng đắn của những hoạt động bên trong. Mock object có những đặc điểm sau:

Đơn giản hơn đối tượng người dùng thực nhưng vẫn giữ được sự tương tác với những đối tượng người dùng khác.

Không tái diễn nội dung đối tượng người dùng thực.

Được chấp nhận thiết lập các trạng thái riêng trợ hỗ trợ cho việc thực hiện unit test.

2. Stub là gì?

Stub là một Khóa học hoặc thành phần giả lập (thay thế cho Khóa học hoặc thành phần chưa code xong để kiểm thử) nó dùng để làm kiểm thử… ví dụ, trong một dự án có 4 modules, nhưng đến lúc test mà còn một module chưa code xong, để test được thì hãy phải có 4 modules này, vậy thì hãy phải có một Khóa học giả lập module này để thực hiện test. Lớp học giả lập cho module này được gọi là STUB.

Oh, cả hai đều sở hữu vẻ khó hiểu!

Xem Thêm : Raptr là gì? Thông tin, link download, file hỗ trợ

Khi tôi mở màn tìm hiểu về unit test, tôi rất khó để phân biệt được Mock và Stub khác nhau ra sao, cả hai thường rất giống nhau trong khái niệm. Nhưng một khi chúng ta hiểu đúng cách rồi thì các bạn sẽ nhận ra sự khác biệt thực sự.

Một Stub không thể trả về kết quả unit test là fail bởi vì bạn biết những gì bạn đang thực hiện và lý do vì sao bạn đang thực hiện nó, Nó được sử dụng là để thay thế cho một module và được giả sử là phải thực hiện đúng các nhiệm vụ được giao. Tuy nhiên, Mock object chỉ là một đối tượng người dùng mà bắt chước các đối tượng người dùng thực sự. Nếu logic chính của method là sai thì những unit test sẽ fail ngay cả những lúc tất cả chúng ta thiết lập mock object chuẩn xác.

3. Fake là gì

Như tất cả chúng ta biết, ý nghĩa của Fake là giả, không thật. Đó là một ý nghĩa nói chung, nó có thể chỉ tới một một object thật hoặc một object giả hoặc giả hoặc một chiếc gì đó không có thật.

Vì vậy, Fake là một thuật ngữ chung chung, mà có thể trỏ đến bất kì điều gì.

4. Ví dụ:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ConsoleApp.Company; namespace ConsoleApp { public interface IExtensionNanager { Boolean CheckExtension(string FileName); } public class ExtensionManager : IExtensionNanager { public bool CheckExtension(string FileName) { //Some complex business logic might goes here. May be DB operation or file system handling return false; } } //Stub implementation to bypass actual Extension manager class. public class StubExtensionManager : IExtensionNanager { public bool CheckExtension(string FileName) { return true; } } public class FileChecker { IExtensionNanager objmanager = null; //Default constructor public FileChecker() { objmanager = new ExtensionManager(); } //parameterized constructor public FileChecker(IExtensionNanager tmpManager) { objmanager = tmpManager; } public Boolean CheckFile(String FileName) { return objmanager.CheckExtension(FileName); } } }

Code này là rất đơn giản để hiểu. Tất cả chúng ta đã có một class FileChecker đơn giản. Class quản lý FileExtension thực tế không được implement đầy đủ và vì vậy tất cả chúng ta có một phiên bản sơ khai của class. Tất cả chúng ta có thể thấy rằng các chức năng CheckExtension sẽ xoành xoạch đúng, khi tất cả chúng ta khái niệm một cách rõ ràng.

Tại chỗ này là code unit test:

using System; using System.Web.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; using MVCApplication.Controllers; using Moq; using ConsoleApp.Company; using ConsoleApp; namespace TestMVC { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { //Act StubExtensionManager stub = new StubExtensionManager(); FileChecker checker = new FileChecker(stub); //kích hoạt bool IsTrueFile = checker.CheckFile(“myFile.whatever”); //Assert Assert.AreEqual(true, IsTrueFile); } } }

Và code unit test trên sẽ xoành xoạch pass bởi vì tất cả chúng ta đã sử dụng các chức năng được khái niệm Stub và nó sẽ làm cho code unit test luôn đúng.

Xem Thêm : Cloud mining là gì? Kiến thức cơ bản về Cloud mining

Vậy một lần nữa để làm rõ hơn ý tưởng thuở đầu, Stub được sử dụng để xoành xoạch vượt qua unit test bởi vì tất cả chúng ta biết những gì tất cả chúng ta đang thực hiện và vì sao? Mục tiêu của tất cả chúng ta là để sở hữu thể pass qua phần unit test này.

Thực hiện Mock trong ví dụ

Thời điểm hiện tại tất cả chúng ta sẽ thực hiện với một Mock object. Có rất nhiều các phương pháp mocking khác nhau, nhưng để nắm vững hơn về thực chất tôi sẽ thực hiện một cách mockig viết tay đơn giản.

Một điểm quan trọng về mock là, tất cả chúng ta có thể sử dụng một đối tượng người dùng mock để kiểm tra class chính trong unit test.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ConsoleApp.Company; namespace ConsoleApp { public interface IServiceProvider { void extensionService(String fileName); } //Mock extenison service provider public class MockExtensionService : IServiceProvider { public string ErrorMessage = null; public void extensionService(string fileName) { if (fileName.Split(‘.’)[1] != “myType”) { ErrorMessage = “Wrong Type”; } } } //Actual incomplete ExtensionManager functionality public class ExtensionManager : IServiceProvider { public void extensionService(string fileName) { throw new NotImplementedException(); } } public class ExtensionAnalyzer { public IServiceProvider provider = null; public ExtensionAnalyzer(IServiceProvider tmpProvider) { provider = tmpProvider; } public void ExtensionCheck(string fileName) { provider.extensionService(fileName); } } }

Thực hiện rất đơn giản, chúng tôi đã chỉ có thực hiện một class Mock và class này sẽ bắt chước các chức năng thực tế. Tại chỗ này là code unit test.

using System; using System.Web.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; using MVCApplication.Controllers; using Moq; using ConsoleApp.Company; using ConsoleApp; namespace TestMVC { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { //Act MockExtensionService mockobject = new MockExtensionService(); //Inject mock object now ExtensionAnalyzer analyzer = new ExtensionAnalyzer(mockobject); //kích hoạt analyzer.ExtensionCheck(“somefile.someextension”); //Assert Assert.AreEqual(mockobject.ErrorMessage, “Wrong Type”); } } }

Tóm lại

Trong nội dung bài viết này, tất cả chúng ta đã học được những khái niệm về StubMock trong unit test. Tôi hy vọng nội dung bài viết này sẽ giúp cho bạn nắm vững hơn về chúng. Tất cả chúng ta cần phải chọn sử dụng Stub hay Mock trong những tình huống riêng biệt.

You May Also Like

About the Author: v1000