2012-03-01 18 views
5

Tôi có một số bài kiểm tra đơn vị mà tôi đang viết cho một ứng dụng WPF, và nhiều như tôi đã cố gắng tránh nó, tôi có một số mã được kiểm tra mà instantiates một View. Ngay khi khung nhìn được khởi tạo, tất cả các phần mở rộng đánh dấu, kiểu, vv được đánh giá. Để giải quyết này, tôi đã tạo ra một hình nộm Application và đăng ký bất kỳ nguồn lực cần thiết khi lắp ráp thử nghiệm được khởi tạo:Đơn vị kiểm thử WPF ứng dụng với gói siteoforigin Uri

[TestClass] 
public class AssemblyInitialize 
{ 
    [AssemblyInitialize] 
    public static void SetupTestAssembly(TestContext context) 
    { 
     if (Application.Current == null) 
      new Application(); 

     var resources = new List<string> 
      { 
       "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml" 
      }; 

     foreach(var resource in resources) 
     { 
      var uri = new Uri(resource); 
      var dictionary = new ResourceDictionary { Source = uri }; 
      Application.Current.Resources.MergedDictionaries.Add(dictionary); 
     } 
    } 
} 

Tôi đã sử dụng phương pháp này trong quá khứ, và nó hoạt động ok.

Tôi đã chạy vào một trò lừa bịp nhỏ với cách tiếp cận này. Tôi có một vài tài nguyên sử dụng gói : // siteoforigin: trong gói Uri và khi thử nghiệm khởi tạo chế độ xem này, tôi gặp lỗi về việc không thể giải quyết tệp.

Các XAML:

<ResourceDictionary 
    xmlns="..."> 

    <ImageBrush 
     x:Key="ResourceName" 
     ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
     /> 
</ResourceDictionary> 

Thông báo Lỗi:

Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png' 

Tôi đã thêm vào thư mục Resources như là một mục triển khai, và tôi đã xác nhận rằng hình ảnh là Thư mục đầu ra TestRun. Dường như AppDomain đang hoạt động một thư mục ở trên nơi vị trí của các hội đồng kiểm tra của tôi, bởi vì tệp thực sự được đặt tại:

c: \ Solution \ TestResults \ Workspace_2012-03-01 14_54_29 \ Out \ Resources \ image.png

Bất kỳ đề xuất nào về cách tôi có thể yêu cầu Ứng dụng WPF sử dụng thư mục Out làm thư mục chính?

+0

Tính năng này có hoạt động để buộc thư mục cơ sở của Appdomain của bạn không? 'AppDomain.CurrentDomain.SetData (" APPBASE "," FolderNameHere ");' Dường như có cách nào tốt hơn, nhưng bộ nhớ của tôi đã thất bại. Điều này có thể đủ tốt (tm). – ianschol

+0

Được đào sâu vào điều này trong nhiều giờ. AppDomain.CurrentDomain.BaseDirectory trả về thư mục Out. – bryanbcook

Trả lời

3

Điều này là bởi vì AppDomain.BaseDirectory do thiết bị thử nghiệm của bạn thiết lập không có ký tự sau '/', điều này làm cho mã phân giải siteoforigin đường dẫn để mất thư mục cuối cùng trong đường dẫn.

Bạn có thể kiểm tra điều này bằng cách xem kết quả của mã sau khi chạy bình thường hoặc trong các thử nghiệm.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 

này đã được gần đây fixed trong NUnit (bao gồm trong 2.6), nhưng vẫn có thể là một vấn đề với chạy thử nghiệm khác.

Nếu bạn quan tâm này là tương đương với loại mã siteoforigin được thực hiện:

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath 

Hãy thử mà có và không có một dấu gạch chéo trong baseDirectory.

+0

Có dấu gạch chéo sau là thủ phạm. Tôi phát hiện ra điều này ngay sau khi đăng bài và chưa quay lại để thêm các phát hiện của tôi, nhưng tôi vẫn chấp nhận câu trả lời của bạn.Tôi đang thực sự sử dụng MSTest trong năm 2010, mà cũng không đặt dấu gạch chéo ở. – bryanbcook

+0

Cảm ơn, tôi đã chỉnh sửa để loại bỏ giả định về NUnit. –