2016-11-08 29 views
5

Tôi đang làm việc trong C++ với bài kiểm tra của Google để kiểm tra đơn vị. Trong mã công ty chúng tôi vẫn có vấn đề, kiểu dữ liệu hệ thống như ví dụ sử dụng CTime ví dụ múi giờ của hệ thống thực tế (chúng tôi sử dụng kiểu dữ liệu CTime giống như trong mã sản xuất). Đối với thử nghiệm đơn vị, chúng tôi muốn mô phỏng các múi giờ khác nhau bởi vì chúng tôi có nhiều vấn đề với điều đó.C++: Cách mô phỏng các múi giờ khác nhau trong các bài kiểm tra đơn vị bằng cách sử dụng kiểm tra google

Tôi đã đầu tư nhiều giờ để nghiên cứu cách người khác làm điều đó vì không thể, rằng các công ty khác không có vấn đề này :) Nhưng tôi không tìm được giải pháp cho điều đó. Suy nghĩ của tôi là như thế này: CTime tự tiết kiệm thời gian trong UTC và chuyển đổi theo yêu cầu thành giờ địa phương. Giả định của tôi là tất cả các hàm này cần hàm GetTimeZoneInformation() được khai báo trong timezonapi.h.

WINBASEAPI 
_Success_(return != TIME_ZONE_ID_INVALID) 
DWORD 
WINAPI 
GetTimeZoneInformation(_Out_ LPTIME_ZONE_INFORMATION lpTimeZoneInformation); 

Vì vậy, giải pháp có thể là trao đổi hàm GetTimeZoneInformation() này bằng một hàm tùy chỉnh, sau đó trả về một đối tượng mà tôi có thể thay đổi theo yêu cầu. Nhưng tôi không biết làm thế nào để làm điều đó và tôi cũng không biết nếu điều này là làm việc sau đó hay không, vì nó có thể chỉ gọi chức năng này một lần khi ứng dụng bắt đầu.

Có ai biết cách xử lý chủ đề này không? Tôi không muốn thay đổi bất kỳ hành vi nào, tôi chỉ muốn có thể đặt múi giờ của riêng mình mà không vi phạm bất kỳ cơ chế tính toán thời gian nào. Điều tốt nhất là nếu tôi bằng cách nào đó có thể chế nhạo các cuộc gọi này mà không cần thay đổi mã sản xuất cho điều đó. Điều này là chương trình này rất lớn, cũ, và ... thay đổi càng ít càng tốt luôn luôn là tốt nhất :)

Nếu tôi chưa tìm thấy bài đăng đã giải quyết được vấn đề thì tôi thực sự xin lỗi vì tôi hoặc không tìm thấy nó hoặc tôi đã không nhận được rằng điều này có thể giúp tôi.

+1

Dường như bạn muốn chúng tôi viết một số mã cho bạn. Trong khi nhiều người dùng sẵn sàng sản xuất mã cho một người lập trình đang gặp khó khăn, họ thường chỉ giúp khi người đăng đã tự mình giải quyết vấn đề. Một cách tốt để chứng minh nỗ lực này là bao gồm mã bạn đã viết cho đến nay, ví dụ đầu vào (nếu có), đầu ra mong đợi và đầu ra bạn thực sự nhận được (đầu ra console, tracebacks, v.v.). Chi tiết bạn cung cấp càng nhiều thì càng có nhiều câu trả lời bạn nhận được. Kiểm tra [FAQ] và [ask]. –

Trả lời

0

Như bạn đã đề cập trong câu hỏi của mình, chế nhạo là một cách hay để giải quyết vấn đề này.

nhanh nhất và dễ nhất cách mà tôi biết để đó là bằng cách gói tất cả các phương pháp bạn muốn kiểm tra trong một lớp học mới, mà thực hiện 'Chiến lược' mẫu thiết kế:

Nó có thể chuyển đổi giữa thực hiện thực tế và mocks, một lần bạn đặt logic thành một mô hình, nó sẽ trả về một giá trị giả.

Theo mặc định, nó phải được đặt thành triển khai thực.

dụ đơn giản với 'int Foo()':

Class Strategy{ 
      int Foo() = o 
    } 

    Class StrategyImplementation 
    { 
    private: 
      Strategy* logic; 
    public: 
      void SetLogic(Strategy* newLogic){logic=newLogic)} 
      int Foo(){return logic->Foo()} 
    } 

    Class mock : public Strategy{ 
    public: 
      SetValue(int value){this.value = value} 
      int Foo(){return value} 
    private: 
      int value; 
     } 

    Class Implementation : public Strategy{ 
     int Foo(){ here_you_call_the_method_you_want_to_test } 
    } 

Tất cả còn lại, là để thay đổi mỗi tiếng gọi của GetTimeZoneInformation để Chiến lược mới, Cách đơn giản nhất để làm điều đó, sẽ là bằng cách sử dụng ' Mẫu thiết kế của Singleton.

Nó không có rủi ro cao, và những thay đổi bạn sẽ cần phải làm là thay đổi các cuộc gọi từ 'Foo()' để 'StrategyImplementation :: getInstance(). Foo()'

Các vấn đề liên quan