Đề Xuất 5/2022 # Unit Test Trong C# Với Nunit Và Moq # Top Like

Xem 18,810

Cập nhật nội dung chi tiết về Unit Test Trong C# Với Nunit Và Moq mới nhất ngày 16/05/2022 trên website Hanoisoundstuff.com. Hy vọng thông tin trong bài viết sẽ đáp ứng được nhu cầu ngoài mong đợi của bạn, chúng tôi sẽ làm việc thường xuyên để cập nhật nội dung mới nhằm giúp bạn nhận được thông tin nhanh chóng và chính xác nhất. Cho đến nay, bài viết này đã thu hút được 18,810 lượt xem.

--- Bài mới hơn ---

  • Unit Testing Ứng Dụng C# Dùng .net Core Và Visual Studio Code
  • 【Hướng Dẫn】 Cách Viết Thư Upu Lần Thứ 50
  • Làm Sao Giỏi Văn, Giỏi Viết Lẫn Lách
  • Hướng Dẫn Cách Viết Văn Hay Cho Các Bạn Học Sinh Mọi Lứa Tuổi
  • Gia Sư Môn Văn Chia Sẻ Cách Viết Văn Hay Và Có Cảm Xúc
  • Giới thiệu

    Trong lập trình hướng đối tượng, mock object là các object mô phỏng các hành vi của object thật. Mock thường được sử dụng trong unit test.

    Nói một cách chính xác thì mock object được tạo ra để giúp kiểm tra hành vi của object (thật) khác. Thế nên, mock là việc làm giả object thật và được kiểm soát sao cho luôn trả về giá trị mong muốn.

    • Object cung cấp các kết quả không xác định.
    • Có các trạng thái khó tạo ra hoặc tạo lại (ví dụ: lỗi đường truyền).
    • Chạy chậm (ví dụ truy vấn database, và nó cần phải được khởi tạo trước khi test).
    • Các hành vi có thể không tồn tại hoặc thay đổi.
    • Sẽ phải bao gồm thông tin và phương pháp dành riêng cho mục đích thử nghiệm.

    Khi chúng ta tạo một mock object, chúng ta có thể cài đặt hành vi cho nó là strict hoặc loose behavior. Strict behavior có nghĩa là exception sẽ được tạo ra nếu những gì chưa được cài đặt trong interface được gọi. Trái lại, loose behaviour sẽ không tạo ra exception trong trường hợp này. Mặc định, mock được cài đặt loose behaviour.

    Moq là gì?

    Moq là một thư viện được viết cho .NET được phát triển từ đầu để tận dụng tối đa .NET 3.5 (tức là các LinQ expssion tree) và những tính năng trong C# 3.0 (tức là Lambda Expssion) làm cho nó trở thành thư viện mock dễ sử dụng nhất, type-safe và tái cấu trúc có sẵn. Và nó hỗ trợ mock interface cũng như class. API của nó cực kỳ đơn giản, và không yêu cầu bất kỳ kiến ​​thức hoặc kinh nghiệm nào trước đây với mock. Tuy nhiên trước đó bạn phải quen với việc sử dụng Lambda Expssion.

    Moq hướng đến sự đơn giản, strongly-typed và tối giản (nhưng vẫn đầy đủ tính năng), sử dụng theo hướng AAA (Arrange – Act – Assert).

    Tác giả của Moq gọi nó là thư viện mock đơn giản nhất cho .NET. Tôi không chắc chắn lắm về điều đó, nhưng tôi có thể xác nhận rằng nó thật sự là một thư viện đơn giản nhưng mạnh mẽ, đó cũng là lý do mà tôi đặc biệt thích dùng Moq.

    Bạn có thể định nghĩa mock cho:

    • Phương thức của Object (Object Methods)
    • Thuộc tính (Properties)
    • Event (Events)
    • Callback (Callbacks)
    • Xác nhận (Verifications)
    • Một vài tình huống nâng cao như xác nhận và thực thi nhiều interface.

    Những framework khác

    • Nsubstitute: Hoàn hảo cho những người mới tiếp cận việc test, hoặc cho những người muốn test của họ có ít lambda hơn.
    • Rhino Mocks: Mã nguồn mở! Rhino Mocks là một mock framework động cho nền tảng .NET. Mục đích của nó là làm cho việc test dễ dàng hơn bằng cách cho phép lập trình viên tạo mock thực thi custom object và xác nhận sự tương tác sử dụng unit test.
    • TypeMock, chúng tôi NMock, FakeItEasy.

    Cài đặt

    Có hai cách để cài đặt Moq, hoặc là sử dụng Nuget, hoặc là cài đặt thủ công.

    • Nếu cài đặt thủ công, chỉ cần download nó từ trang chủ, sau đó thêm reference vào project.

    System Under Test

    Lấy một đoạn code chúng ta cần test như sau:

    public class CustomerService { private ICustomerRepository _repository; public CustomerService(ICustomerRepository repository) { _repository = repository; } public Customer GetCustomer(int id) { return _repository.GetCustomer(id); } } public interface ICustomerRepository { Customer GetCustomer(int id); } public class Customer { public string LastName { get; set; } public string FirstName { get; set; } }

    Như bạn có thể thấy, chúng ta có CustomerService phụ thuộc vào ICustomerRepository, đóng vai trò là giao diện cho một class, ví dụ như nó sẽ trả về dữ liệu khách hàng từ database. Tôi sẽ bỏ qua phần thực thi giao diện này bởi vì chúng ta sẽ mock nó, do chúng ta không muốn truy cập vào database rồi lấy dữ liệu của một Customer. Như đã nói trước đó, test cần phải có kết quả xác định, không phát sinh những thứ không mong muốn và chạy nhanh.

    Ví dụ test đơn giản

    Trong test đầu tiên, chúng ta sẽ tạo một mock cho interface IcustomerRepository và cài đặt các thông số mong muốn. Các thông số mong muốn gồm có: những tham số mà phương thức nhận vào, và kết quả trả về ra sao.

    [TestMethod] public void GetCustomer_ValidId() { const int CUSTOMER_ID = 1; const string FNAME = "John"; const string LNAME = "Doe"; //-- Creating a fake ICustomerRepository object //-- Setting up the repository in order to return //-- exactly what we expect. repository .Returns(new Customer { FirstName = FNAME, LastName = LNAME }); var service = new CustomerService(repository.Object); var customer = service.GetCustomer(CUSTOMER_ID); Assert.IsTrue(customer != null); Assert.IsTrue(customer.FirstName == FNAME); Assert.IsTrue(customer.LastName == LNAME); }

    Giải thích qua về đoạn test trên:

    tạo ra một object thực thi tất cả phương thức và thuộc tính đã được định nghĩa trong interface ICustomerRepository.

    Mặt khác, Moq sử dụng LinQLambda Expssion như sau:

    repository .Returns(new Customer { FirstName = FNAME, LastName = LNAME });

    đoạn code trên làm 2 việc:

    1. Phương thức Returns định nghĩa giá trị trả về trong quá trình test chạy.

    sau khi cài đặt xong, Moq sẽ tạo ra một object giống như thế này:

    public class SomeClassName: ICustomerRepository { public Customer GetCustomer(int id) { return new Customer { FirstName = "John", LastName = "Doe" }; } }

    Như bạn có thể thấy, class thực thi từ interface ICustomerRepository trả về giá trị có dạng “hardcoded”. Thay vì sử dụng Moq (hay bất kỳ framework nào khác), chúng ta có thể tự làm điều này, nhưng mà dùng framework làm cho mọi thứ đơn giản hơn.

    Kết luận

    Moq là framework đầu tiên mà tôi dùng do tính đơn giản cũng như số lượng tính năng mà nó mang lại. Việc giải thích các khái niệm mà M oq triển khai cho thành viên trong team thường rất đơn giản và dễ hiểu. Lưu ý rằng, ví dụ trong bài viết này là ví dụ đơn giản nhất, còn nhiều trường hợp khác test rất phức tạp cũng có thể dùng Moq. Trong phần tiếp theo sẽ giới thiệu rõ hơn cách sử dụng Moq. Happy coding!

    --- Bài cũ hơn ---

  • Hướng Dẫn Viết Unit Test Trong React
  • Hướng Dẫn Viết Unit Test Trong Angular
  • Unit Test Là Gì? 10 Frameworks Unit Test Cho Javascript
  • Tìm Hiểu Về Jestjs, Viết Unit Test Cho Javascript
  • Viết Unit Test Cho Javascript Với Jasmine
  • Bạn đang đọc nội dung bài viết Unit Test Trong C# Với Nunit Và Moq trên website Hanoisoundstuff.com. Hy vọng một phần nào đó những thông tin mà chúng tôi đã cung cấp là rất hữu ích với bạn. Nếu nội dung bài viết hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!

  • Web hay
  • Links hay
  • Guest-posts
  • Push
  • Chủ đề top 10
  • Chủ đề top 20
  • Chủ đề top 30
  • Chủ đề top 40
  • Chủ đề top 50
  • Chủ đề top 60
  • Chủ đề top 70
  • Chủ đề top 80
  • Chủ đề top 90
  • Chủ đề top 100
  • Bài viết top 10
  • Bài viết top 20
  • Bài viết top 30
  • Bài viết top 40
  • Bài viết top 50
  • Bài viết top 60
  • Bài viết top 70
  • Bài viết top 80
  • Bài viết top 90
  • Bài viết top 100
  • Chủ đề top 10
  • Chủ đề top 20
  • Chủ đề top 30
  • Chủ đề top 40
  • Chủ đề top 50
  • Chủ đề top 60
  • Chủ đề top 70
  • Chủ đề top 80
  • Chủ đề top 90
  • Chủ đề top 100
  • Bài viết top 10
  • Bài viết top 20
  • Bài viết top 30
  • Bài viết top 40
  • Bài viết top 50
  • Bài viết top 60
  • Bài viết top 70
  • Bài viết top 80
  • Bài viết top 90
  • Bài viết top 100