2013-04-27 37 views
5

Tôi đã sử dụng Phát triển thử nghiệm trong ứng dụng Seaside tôi đã chơi cùng và tất cả dữ liệu của tôi được lưu trữ dưới dạng đối tượng trong hình ảnh (trái ngược với cơ sở dữ liệu).Đồ đạc thử nghiệm hoặc tương đương với dữ liệu thử nghiệm với Smalltalk Seaside?

Vì vậy, khi tôi chạy thử nghiệm của tôi, tôi đã phải cẩn thận để lưu trữ đi những dữ liệu thực tế trước khi nó được đưa vào thùng rác với dữ liệu thử nghiệm, như thế này:

ToDoTest>>setUp 
    savedTasks := Task tasklist. 
    Task deleteAllTasks. 

    savedProjects := ToDoProject projectlist. 
    ToDoProject deleteAllProjects. 

    savedPeople := Person peoplelist. 
    Person deleteAllPeople. 

Và:

ToDoTest>>tearDown 
    Task tasklist: savedTasks. 
    ToDoProject projectlist: savedProjects. 
    Person peoplelist: savedPeople 

Vấn đề xảy ra khi các thử nghiệm của tôi thất bại, tất nhiên là họ làm điều này, bật lên trình gỡ rối, và sau đó tôi có thể sửa chữa, nhưng tearDown không phải lúc nào cũng được gọi và vì vậy tôi có thể mất dữ liệu thực của mình.

Tôi lưu dữ liệu ra tệp, do đó, nó không phải là một vấn đề lớn, nhưng nó không phải là trơn tru và tự động như tôi muốn nó được.

Dù sao tôi có thể cải thiện điều này?

Trả lời

6

Tôi không chắc liệu có kịch bản nào khắc phục được sự cố hoàn toàn hay không. Vấn đề thực sự là mô hình là toàn cầu. Đó là thuận tiện và tốt đẹp nhưng nó không dễ dàng trong một kịch bản như vậy. Vì vậy, tôi sẽ xem xét việc thay đổi mô hình từ một cái gì đó toàn cầu thành một biến thể được bản địa hoá hơn để bạn có thể tạo mô hình của mình chỉ nhằm mục đích thử nghiệm mà không can thiệp vào dữ liệu sản xuất.

Để khắc phục sự cố trong thiết lập hiện tại, bạn cần thêm bảo đảm: chặn ở đâu đó. Một khối đảm bảo "đảm bảo" cho bạn rằng một cái gì đó được thực thi bất kể mọi thứ đã ổn hay đã xảy ra lỗi. Vấn đề là bạn cần phải làm điều đó trước và sau khi thử nghiệm.

Trong trường hợp này tôi sẽ ghi đè lên TestCase >> # runCase trong lớp thử nghiệm của riêng bạn với một cái gì đó giống như

runCase 
    [ self saveRealModel. 
     super runCase ] 
     ensure: [ self restoreRealModel ] 
+0

Thú vị. Tôi nghĩ ý tưởng phân vùng dữ liệu theo một cách nào đó có thể giúp ích ở đây. Ví dụ ứng dụng công việc đơn giản của tôi hiện không có khái niệm về người dùng, tôi có thể thêm các ứng dụng này và sau đó tạo người dùng thử nghiệm cho các bài kiểm tra đơn vị. –

+0

Có nhiều cách để làm điều đó. Nếu bạn muốn bản địa hóa dữ liệu của bạn một cách dễ dàng là di chuyển mọi thứ từ bên lớp sang bên ví dụ. Nếu ToDoProject là lớp chính của bạn, hãy di chuyển các phương thức bên lớp sang phía cá thể. Bạn sẽ có ToDoProject >> # taskList, ToDoProject >> # projectList, ... Trong bước đầu tiên bạn có thể thực hiện ToDoProject một singleton để lớp ToDoProject >> # mặc định sẽ trả về thể hiện ToDoProject bằng dữ liệu thực của bạn.Thành phần bên bờ biển của bạn sẽ có một "dự án" instVar. Sau đó, bạn cấu hình thành phần của mình với "ToDoProject default" để sử dụng thực tế và để kiểm tra bạn thiết lập "ToDoProject new" –

2

Ah, đó là một thử mùi thoải mái. Norbert là đúng trong chỉ ra rằng mô hình thử nghiệm của bạn có lẽ nên không được toàn cầu. Hầu hết các thử nghiệm phải dựa trên sự tương tác giữa các đối tượng riêng lẻ. Trong StoryBoard, chúng tôi có người dùng

DEUser subclass: #SBUser 
    instanceVariableNames: 'email initials projects invitations' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'StoryBoard-Data' 

với người dùng instancevar lớp làm điểm nhập cảnh. Các dự án chỉ có thể truy cập thông qua người dùng.

users 
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new 
     userid: 'admin'; 
     password: 'admin'; 
     yourself) 
    ] 

và là một cách để xóa chúng

resetUsers 
    " SBUser resetUsers " 
    users := nil 

Thường thì chúng ta có thể vượt qua trong phụ thuộc vào sự sáng tạo cho các đối tượng miền

Iteration>on: aProject 
    ^self new 
     project: aProject; 
     yourself 

Điều này cho phép một testcase để vượt qua bản thân hoặc một riêng biệt (mock) đối tượng

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