Tôi có một lớp Transfer
, đơn giản hóa nó trông như thế này:Mocking một phương pháp để ném một ngoại lệ (moq), nhưng nếu không hành động như đối tượng giả?
public class Transfer
{
public virtual IFileConnection source { get; set; }
public virtual IFileConnection destination { get; set; }
public virtual void GetFile(IFileConnection connection,
string remoteFilename, string localFilename)
{
connection.Get(remoteFilename, localFilename);
}
public virtual void PutFile(IFileConnection connection,
string localFilename, string remoteFilename)
{
connection.Get(remoteFilename, localFilename);
}
public virtual void TransferFiles(string sourceName, string destName)
{
source = internalConfig.GetFileConnection("source");
destination = internalConfig.GetFileConnection("destination");
var tempName = Path.GetTempFileName();
GetFile(source, sourceName, tempName);
PutFile(destination, tempName, destName);
}
}
Các phiên bản đơn giản của giao diện IFileConnection
trông như thế này:
public interface IFileConnection
{
void Get(string remoteFileName, string localFileName);
void Put(string localFileName, string remoteFileName);
}
Lớp thực là nghĩa vụ phải xử lý một System.IO.IOException
đó là bị ném khi lớp bê tông IFileConnection
mất kết nối với điều khiển từ xa, gửi email và những gì không.
Tôi muốn sử dụng Moq để tạo ra một lớp Transfer
, và sử dụng nó như lớp bê tông của tôi Transfer
trong tất cả các thuộc tính và phương pháp, trừ khi các phương pháp GetFile
được gọi - sau đó tôi muốn nó ném một System.IO.IOException
và chắc chắn rằng Transfer
lớp xử lý nó đúng cách.
Tôi có sử dụng đúng công cụ cho công việc không? Tôi đang đi về điều này đúng cách? Và làm cách nào để tôi viết thiết lập cho thử nghiệm đơn vị đó cho NUnit
?
Hmm. Không phải những gì tôi mong đợi, và bây giờ tôi thấy tôi đã đơn giản hóa lớp 'Transfer' của mình quá nhiều. Bạn có thể nhìn vào những thay đổi mà tôi đã thực hiện cho lớp 'Transfer' không? Điều này giống mã của tôi một chút chặt chẽ hơn. Các thuộc tính được trưng ra trong lớp, nhưng tôi đã làm điều đó chủ yếu để tôi có thể kiểm tra điều kiện ngoại lệ. Là những gì tôi đã cố gắng để làm một cách sai lầm? –
@JeremyHolovacs Tôi đã cập nhật câu trả lời của mình. –
Hmm. Những gì tôi nghĩ sẽ đơn giản dường như nhận được ít hơn như vậy. Hãy để tôi hỏi bạn điều này: nó sẽ có ý nghĩa hơn để tạo ra một lớp thử nghiệm kế thừa từ 'Transfer' và ghi đè lên phương thức cho mục đích thử nghiệm? Có lẽ chế nhạo không phải là công nghệ thích hợp để sử dụng trong kịch bản này, và tôi đang cố gắng để đẩy một chốt vuông vào một lỗ tròn? –