2010-09-10 17 views
6

Làm thế nào tôi có thể đánh lừa DataContext mà tôi đang sử dụng trong một lớp để viết thư vào một bảng. Tôi muốn khẳng định rằng bảng LINQ đang viết để có số lượng tin nhắn dự kiến. Đây là những gì tôi có cho đến nay.Moling DataContext với MS Moles?

var context = new MJustTestingDataContext(); 
MyMessagewriter writer = new MyMessageWriter(context); 

var messageList = new List<MIncmoingMessage>(); 
MTable<MIncomingMessage> messageTable = new MTable<MIncomingMessage>(); 
messageTable.Bind(messagesLinqList.AsQueryable()); 

Nếu tôi sử dụng mã này với xUnit trong lớp học của tôi được kiểm tra tôi sẽ nhận được ngoại lệ này

Microsoft.Moles.Framework.Moles.MoleNotImplementedException: DataContext.Dispose() was not moled. 

tôi đang thiếu gì ở đây và làm thế nào để thực hiện DataContext.Dispose() trên các nốt ruồi? Tôi đang sử dụng nốt ruồi độc lập mà không có Pex.

Trả lời

3

Khi bạn tạo một nốt ruồi mới, hành vi mặc định cho các phương pháp và thuộc tính của nó là để ném MoleNotImplementedException bất cứ khi nào chúng được gọi.

Để thực hiện nốt ruồi, bạn có thể thực hiện context.Dispose =() => {}; có nghĩa là không có gì xảy ra khi phương pháp Dispose được gọi trên phiên bản được làm mờ. Tôi đọc lại câu hỏi và có thể bạn đang gặp vấn đề vì Dispose được định nghĩa trong một lớp cơ sở. Để Mole phương pháp cơ bản bạn cần phải làm như sau:

var context = new MJustTestingDataContext(); 
var baseContext = new MDataContext(context); 

baseContext.Dispose =() => {}; 

Bạn sẽ cần phải thực hiện tất cả các tài sản/phương pháp đó được gọi bằng mã theo thử nghiệm hoặc bạn có thể thiết lập các hành vi mặc định cho các trường hợp nốt ruồi trên toàn cầu sử dụng phương pháp BehaveAsDefaultValue. Bằng cách này, mọi phương thức trong nốt ruồi sẽ không làm gì và trả về giá trị mặc định cho kiểu trả về nếu nó tồn tại thay vì ném một số MoleNotImplementedException. Tuy nhiên nếu bạn yêu cầu hành vi này thì tốt hơn nên sử dụng một cái cuống hơn là một nốt ruồi.

+0

Tôi đã có cùng một vấn đề, đây là câu trả lời đúng – omatase

0

Tôi đang gặp khó khăn khi hiểu thử nghiệm của bạn đang làm gì. Tôi đã phải làm một cái gì đó tương tự ngày hôm qua, vì vậy tôi sẽ chia sẻ kinh nghiệm của tôi. Đầu tiên, điều quan trọng là phải hiểu rằng bạn không cần phải sử dụng tất cả các MoleTypes để kiểm tra mã của bạn - bạn chỉ cần sử dụng các nốt ruồi để chuyển hướng các phần nhất định của mã của bạn đến các biểu thức lambda. Với một phương pháp mà thực hiện điều này:

  1. có được một danh sách các người dùng chỉnh sửa từ cơ sở dữ liệu
  2. sửa đổi mỗi người dùng trong tập
  3. gửi tập mới trở lại cơ sở dữ liệu

tôi muốn chuyển hướng 1 và 3 để không sử dụng cơ sở dữ liệu. Ví dụ, tôi có thể chuyển hướng cuộc gọi đến SubmitChanges (3) thông qua mã này:

bool hitSubmitChanges = false; 
int changeCount = 0; 
IList<object> updates = null; 

// more code here... 

    // redirect DataContext.SubmitChanges() to a lambda to catch updates 
    MDataContext.AllInstances.SubmitChanges = (c) => 
    { 
    changeCount = c.GetChangeSet().Updates.Count; 
    updates = c.GetChangeSet().Updates; 
    hitSubmitChanges = true; 
    }; 

Đó (và các cuộc gọi chỉ khiến người dùng) sẽ là Moletypes duy nhất tôi muốn sử dụng trong các thử nghiệm. Phần còn lại của nó sẽ là bình thường. Sau đó, tôi có thể sử dụng các xác nhận để kiểm tra các giá trị của changeCount, updates và hitSubmitChanges.

+1

Lưu ý cho người khác: MDataContext yêu cầu được sử dụng ở đây yêu cầu tạo Mole cho System.Data.Linq. – sfuqua

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