2013-07-17 23 views
10

Tôi vừa bắt đầu thử nghiệm moq để kiểm tra đơn vị mô-đun của mình.Nhận đường dẫn lắp ráp mong muốn/chính xác trong khi thử nghiệm đơn vị với NUnit

Trên thực tế, các lớp mà tôi phải viết một bài kiểm tra đơn vị sử dụng

Assembly.GetExecutingAssembly().Location trong nội bộ để xác định một con đường.

Nhưng, điều này không làm việc trong khi viết bài kiểm tra đơn vị bởi vì, đường dẫn của hội đồng thực hiện là khác nhau (đường dẫn của hội đồng kiểm tra đơn vị được thực hiện)

AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.

Tôi đã thử, vô hiệu hóa sao chép bóng.

AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",}; 
appDomain.ShadowCopyFiles=false.ToString(); 

vẫn còn, nó không hoạt động!

Mọi đề xuất đều được đánh giá cao. Cảm ơn trước.

+0

Tôi cũng gặp một số vấn đề với đường dẫn lắp ráp trong khi kiểm tra đơn vị. Có lẽ nó giúp, hãy xem http://stackoverflow.com/questions/17313831/get-path-of-referenced-project-during-unit-testing –

+1

@OP Tôi nghi ngờ rằng đây là một vấn đề với moq. Bạn đang sử dụng khung kiểm tra nào?NUnit, ví dụ chạy các thử nghiệm trong một AppDomain riêng biệt với ShadowCopy được kích hoạt. –

Trả lời

1

Cuối cùng, tôi đã thực hiện việc này thông qua cách này:

Tôi đã sử dụng NUnit Framework và tắt tính năng Sao chép bóng trong NUnit. Đã tạo một bản sao của tệp cấu hình của tôi trong thư mục đó, nơi thư viện kiểm tra đơn vị được gọi. Vì vậy, bất cứ khi nào kiểm tra đơn vị của tôi được gọi (nói từ đường dẫn 'A'), ứng dụng của tôi không phàn nàn rằng không có tệp cấu hình ở vị trí đó vì tôi đặt tệp cấu hình của tôi trong đường dẫn 'A'.

(ps: Lý do tại sao tôi có được vị trí lắp ráp là để có thể tìm thấy tập tin cấu hình của tôi trong vị trí đó)

[Toàn bộ ý tưởng là thế này: với sao chép bóng, con đường lắp ráp là năng động. vô hiệu hóa nó và đường dẫn lắp ráp là tĩnh]

+0

Bạn đã tắt ShadowCopy như thế nào? Tôi đã thử tất cả các loại mã và không có gì dường như tắt nó đi. Bạn có thể cho chúng tôi một mẫu không? – Erick

+0

Thực ra, tôi đã tắt tính năng sao chép bóng trong NUnit. Vào Tools-> Settings và bỏ chọn hộp kiểm 'Enable Shadow Copy'. Điều đó sẽ làm các trick. –

+0

Ah. Tôi nghĩ rằng bạn đã xóa nó khỏi ứng dụng. Tôi đã cố gắng xóa nó khỏi ứng dụng dành cho máy tính để bàn của mình và không có gì có hiệu quả. – Erick

4

Có lẽ không phải là câu trả lời chính xác cho câu hỏi của bạn, nhưng cá nhân, tôi thậm chí sẽ không cố gắng để có được giá trị thực tế của Assembly.GetExecutingAssembly().Location trong khi kiểm tra đơn vị. Tôi muốn tạo ra một cái gì đó như thế này:

public interface IAssemblyHelper 
{ 
    string GetLocationOfExecutingAssembly(); 
} 

public class AssemblyHelper : IAssemblyHelper 
{ 
    public string GetLocationOfExecutingAssembly() 
    { 
     return Assembly.GetExecutingAssembly().Location; 
    } 
} 

Khi chạy, tôi muốn tiêm AssemblyHelper vào constructor của lớp mà yêu cầu nó, như IAssemblyHelper. Trong các bài kiểm tra đơn vị, tôi muốn giả lập IAssemblyHelper, thiết lập nó để trả về một đường dẫn mong đợi và truyền mô phỏng vào hàm tạo của lớp.

Kiểm tra xem mã có hoạt động với đường dẫn vị trí lắp ráp thực thi trong ứng dụng của bạn không phải là một phần của thử nghiệm chấp nhận hay không.

+0

Điểm sử dụng đường dẫn tương đối là khi những người khác kiểm tra mã của bạn theo một đường dẫn khác với bạn mong đợi, nó sẽ vẫn hoạt động. "thiết lập nó để trả lại đường dẫn mong đợi"/đường dẫn mã hóa cứng - – TamusJRoyce

+0

@TamusJRoyce Bạn đã hiểu lầm. Điều này không liên quan gì đến các đường dẫn tương đối hoặc kiểm tra mã. Tôi đang ủng hộ việc thiết lập ** một giả ** của 'IAssemblyHelper' để trả về một chuỗi đã biết cho đường dẫn có thể được khẳng định trong các bài kiểm tra đơn vị. Trong mã thời gian chạy, cuộc gọi sẽ đi qua lớp bê tông 'AssemblyHelper' và trả về vị trí của assembly thực thi. –

1

Đồng nghiệp của tôi đề nghị một giải pháp sau đây mà làm việc cho tất cả các trường hợp sử dụng của chúng tôi:

public static string AssemblyDirectory 
{ 
    get 
    { 
     string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
     var uri = new UriBuilder(codeBase); 
     string path = Uri.UnescapeDataString(uri.Path); 
     return Path.GetDirectoryName(path); 
    } 
} 
Các vấn đề liên quan