Bài kiểm tra đơn vị viết cho một lớp bắt đầu EXE bên ngoài


9

Tôi đã viết một lớp C # được sử dụng để bắt đầu một danh sách các EXE (không phải một trong số các EXE của tôi - tôi phải chạy) và giữ cho chúng chạy (thỉnh thoảng sẽ kiểm tra để chắc chắn rằng nó vẫn đang chạy và khởi động chúng nếu không) .

Tôi có thể kiểm tra logic cơ bản của việc thêm, xóa, v.v. Làm thế nào để tôi kiểm tra đơn vị rằng công việc thực tế của việc giữ EXE sẽ hoạt động?

Suy nghĩ ban đầu của tôi là bắt đầu một số EXE giả tự đóng lại sau 1 giây, sau đó sử dụng nó để kiểm tra. Có phải đó là ra khỏi lĩnh vực kiểm tra đơn vị?

Câu trả lời:


12

Suy nghĩ ban đầu của tôi là bắt đầu một số EXE giả tự đóng lại sau 1 giây, sau đó sử dụng nó để kiểm tra. Có phải đó là ra khỏi lĩnh vực kiểm tra đơn vị?

Đây có phải là một bài kiểm tra tốt? Chắc chắn, vì vậy tạo ra nó. Đây có phải là "Bài kiểm tra đơn vị" theo nghĩa thực sự của từ này không? Tôi không nghĩ vậy, tôi sẽ gọi đây là "kiểm tra hệ thống" hoặc đại loại như thế, nhưng điều đó không làm cho bài kiểm tra ít giá trị hơn.


9

Mock nó ra ở một mức độ cao hơn thế. Tạo một lớp proxy xung quanh Process.Start(), giả mạo trong kiểm tra và kiểm tra đầu vào.

public interface IProcessProxy
{
     ProcessInfo Start(string application, string[] arguments);
}

public class ProcessProxy : IProcessProxy
{
    public ProcessInfo Start(string application, string[] arguments)
    {
        return Process.Start(application, arguments);
    }
}

// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
    private string _expectedApplication;
    private string[] _expectedArguments;
    private ProcessInfo response;

    public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
    {
         _expectedApplication = expectedApplication;
         _expectedArguments = expectedArguments;
    }

    public ProcessInfo Start(string application, string[] arguments)
    {
         // compare input to expectations and throw exception if not matching
         return _response;
    }
}

// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
    public ClassUnderTest(IProcessProxy proxy)
    {
        _proxy = proxy;
    }

    public ClassUnderTest() : this(new ProcessProxy())
    {
    }

    public void MethodUnderTest()
    {
        // Do stuff

        ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            // Act on success
        }
        else
        {
            // Act on failure
        }
    }   
}

Bất cứ nơi nào bạn cần sử dụng ClassUnderTest trong mã ứng dụng, hãy sử dụng hàm tạo mặc định. Trong các thử nghiệm của bạn, hãy chuyển FakeProcessProxy cho nhà xây dựng khác, sử dụng các tham số Proxy Start dự kiến ​​của bạn và kết quả kiểm tra của bạn trong hàm tạo của fake.


4

Khi tuân thủ nghiêm ngặt triết lý không chú ý (nhấn mạnh vào đơn vị ), bạn không nên tạo tệp exe mà thay vào đó kiểm tra xem lớp của bạn có gọi các giao diện để sinh sản và giám sát quá trình đó một cách chính xác không. Rốt cuộc, bạn muốn kiểm tra lớp của bạn, không phải thư viện chịu trách nhiệm xử lý quy trình.

Nhưng từ quan điểm thực dụng, cách tiếp cận của bạn là tốt, mặc dù 1 giây có vẻ hơi dài.


1

Tôi đã làm một cái gì đó tương tự, nhưng chỉ cần gọi ping localhost. Lưu lại rắc rối khi đặt các tệp thực thi trên máy chủ xây dựng của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.