2015-04-06 10 views
5

Tôi muốn viết một bài kiểm tra đơn vị cho một phương thức in ra đầu ra tiêu chuẩn. Tôi đã thay đổi mã để nó in thành một phiên bản File được thông qua thay vì đó là stdout theo mặc định. Điều duy nhất tôi thiếu là một số trong bộ nhớ File thể hiện mà tôi có thể chuyển vào. Có một điều như vậy? Bất kỳ đề nghị? Tôi muốn một cái gì đó như thế này đã làm việc:Tệp trong bộ nhớ để hủy gửi

import std.stdio; 

void greet(File f = stdout) { 
    f.writeln("hello!"); 
} 

unittest { 
    greet(inmemory); 
    assert(inmemory.content == "hello!\n") 
} 

void main() { 
    greet(); 
} 

Bất kỳ cách tiếp cận nào khác cho mã thử nghiệm đơn vị in tới stdout?

+0

Liệu điều này cần phải được nền tảng chéo? –

+0

Không; Ví dụ. dòng mới trên các nền tảng khác nhau có thể khác nhau. Tôi không muốn thử nghiệm khía cạnh này, nhưng chỉ có nội dung in được. Vì vậy, thay vì 'File' tôi cần một cái gì đó như' OutputStreamWriter' trong Java, có nghĩa là, tôi sẽ ở trong mức độ của các ký tự unicode thay vì mã hóa, hệ thống tập tin, vv Nó sẽ là tốt đẹp nếu chạy thử nghiệm của tôi trên tất cả các nền tảng tất nhiên ... – Tamas

Trả lời

1

Thay vì dựa vào File là loại khá thấp, hãy truyền đối tượng qua giao diện.

Như các bạn đã aluded để trong bình luận của bạn OutputStreamWriter trong Java là một wrapper của nhiều giao diện được thiết kế để trở thành một trừu tượng trên dòng byte, vv Tôi muốn làm như vậy:

interface OutputWriter { 
    public void writeln(string line); 
    public string @property content(); 
    // etc. 
} 

class YourFile : OutputWriter { 
    // handle a File. 
} 

void greet(ref OutputWriter output) { 
    output.writeln("hello!"); 
} 

unittest { 

    class FakeFile : OutputWriter { 
     // mock the file using an array. 
    } 

    auto mock = new FakeFile(); 

    greet(inmemory); 
    assert(inmemory.content == "hello!\n") 
} 
+0

Cảm ơn! Tôi muốn cơ sở tương tự được cung cấp bởi thư viện chuẩn. Hoặc một số cơ sở chế nhạo để tránh các boilerplate hoàn toàn trong mã 'sản xuất'. Bằng cách này writeln với tất cả nó còi và chuông là không thích hợp cho mã sản xuất. – Tamas

+0

Có nhiều thư viện kiểm tra đơn vị có sẵn tại đây: http://code.dlang.org/ Một thư viện tôi viết có chức năng mô phỏng. https://github.com/nomad-software/dunit –

+0

Cảm ơn! Tôi đã bắt đầu tìm kiếm ... tất nhiên sẽ thích một cái gì đó mà không có phụ thuộc bên ngoài .. Bây giờ tôi chỉ cần bỏ qua unittesting của phần này. :) – Tamas

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