2012-08-13 52 views
7

Tôi đang viết bài kiểm tra cho một lớp tải hình ảnh và thực hiện một số thao tác màu. Hình ảnh được tải vớiTải hình ảnh thử nghiệm để kiểm tra đơn vị

UIImage* image = [UIImage imageNamed:imageName]; 

Nếu tôi chạy ứng dụng mọi thứ đều tốt và hình ảnh được tải như mong đợi. Tôi đã thêm một bài kiểm tra đơn vị sẽ sử dụng một hình ảnh thử nghiệm cụ thể để được tải trong khi kiểm tra. Nếu tôi chạy thử nghiệm, hình ảnh không được tải. Những gì tôi đọc cho đến nay là phương thức imageNamed luôn tải từ thư mục tài nguyên của gói ứng dụng. Làm thế nào tôi có thể thay đổi điều này thành bó thử nghiệm của tôi?

Trả lời

0

tốt, một tùy chọn là thêm tài nguyên đó vào thử nghiệm (ứng dụng) của bạn.

cá nhân, tôi chỉ sử dụng đường dẫn (initWithContentsOfFile:), dữ liệu (initWithData:), v.v. điều này có thể liên quan đến việc giới thiệu một vài tham số - nhưng đó là tốt trong nhiều trường hợp, vì thông số đó có thể được sử dụng để kiểm tra nhiều tệp hình ảnh đầu vào hơn (nếu bạn thích) trong khi không thay đổi/nhân bản/đóng gói lại ứng dụng nhiều.

+0

Nhưng điều này có nghĩa là bạn nên thay đổi mã sản xuất cho mục đích thử nghiệm, mà không phải là trường hợp e đặc biệt không phải cho các bộ phận khung được thực hiện để làm cho cuộc sống của bạn dễ dàng hơn;). – trumi

+0

@truni vì vậy ... bạn đang cố gắng thuyết phục tôi rằng bạn đang sử dụng '[UIImage imageNamed:]' cho các phần của khung công tác của bạn, và đó là cách nó nên? sử dụng '[UIImage imageNamed:]' trong ngữ cảnh đó là một ý tưởng thực sự tồi vì một vài lý do. nếu bạn đang viết một khung công tác giả, hãy sử dụng NSBundle và chỉ định hoặc tìm thư mục tài nguyên của khung công tác giả của bạn. sau đó sử dụng một cái gì đó khác với '[UIImage imageNamed:]'. sau đó tạo một gói khác cho biến thể thử nghiệm của bạn và chạy thử nghiệm của bạn trên tất cả các gói. – justin

+0

và trong bối cảnh đó, nó không thay đổi mã cho mục đích thử nghiệm, nó sẽ thay đổi mã của bạn bởi vì mã của bạn đã làm điều sai trái. thay vì tạo một gói mới mọi lúc, bạn có thể chuyển các tham số này đến giao diện của khung công tác của bạn (công khai hoặc riêng tư). – justin

2

Nếu bạn có nghĩa là bạn có một hình ảnh trong nhóm thử nghiệm mà bạn muốn chỉ sử dụng trong các thử nghiệm (ví dụ: thử nghiệm), hãy xem this answer.

Bạn có thể điều chỉnh câu trả lời đó để lấy NSBundle của ứng dụng thực tế bằng cách sử dụng [NSBundle bundleForClass:[SomeClassThatExistsInTheAppOnly class]]. Điều này cho phép bạn nhắm mục tiêu cụ thể gói ứng dụng từ gói thử nghiệm.

4

Tạo danh mục tiện dụng cho việc này.

image = [UIImage testImageNamed:@"image.png"]; 

Goes như:

@interface BundleLocator : NSObject 
@end 

@interface UIImage (Test) 
+(UIImage*)testImageNamed:(NSString*) imageName; 
@end 

@implementation BundleLocator 
@end 

@implementation UIImage (Test) 
+(UIImage*)testImageNamed:(NSString*) imageName 
{ 
    NSBundle *bundle = [NSBundle bundleForClass:[BundleLocator class]]; 
    NSString *imagePath = [bundle pathForResource:imageName.stringByDeletingPathExtension ofType:imageName.pathExtension]; 
    return [UIImage imageWithContentsOfFile:imagePath]; 
} 
@end 
1

Bạn cũng có thể sử dụng này (trong Swift):

let bundle = NSBundle(forClass: MyClass.self) 
let img = UIImage(named: "TestImage", inBundle: bundle, compatibleWithTraitCollection: nil) 
4

Trong Swift 3.0 bạn sẽ làm gì:

let bundle = Bundle.init(for: NameOfYourTestClass.self) 
let image = UIImage(named: "TestImage", in: bundle, compatibleWith: nil) 

đâu NameOfYourTestClass là tên của lớp kiểm tra của bạn ✌️

0

Để thay đổi gói ứng dụng:

let bó = Bundle (định danh: "org.cocoapods.ACSPLib")

let ảnh = UIImage (tên: nameofThePhoto, trong: bó, compatibleWith: nil)

bó định danh

bundle identifier for pod

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