Giả sử tôi có tổ chức sau đây:Mocking Guid.NewGuid()
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public Guid UserGuid { get; set; }
public Guid ConfirmationGuid { get; set; }
}
Và phương pháp giao diện sau:
void CreateUser(string username);
Một phần của việc thực hiện nên tạo hai GUID mới: một cho UserGuid
, và một cho ConfirmationGuid
. Họ nên làm điều này bằng cách đặt các giá trị thành Guid.NewGuid()
.
Tôi đã đã trừu tượng hóa Guid.NewGuid() sử dụng một giao diện:
public interface IGuidService
{
Guid NewGuid();
}
Vì vậy, tôi có thể dễ dàng chế nhạo này khi chỉ có một mới GUID là cần thiết. Nhưng tôi không chắc chắn làm thế nào để giả lập hai cuộc gọi khác nhau cho cùng một phương pháp, từ bên trong một phương pháp, sao cho chúng trả về các giá trị khác nhau.
Nhưng điều này không giả định rằng tôi đang đặt thuộc tính trong quá trình triển khai theo một chuỗi nhất định? Điều này không phải là mối quan tâm của bài kiểm tra của tôi? Nói cách khác, các trường này có thể được đặt theo thứ tự bất kỳ, và nếu vì một lý do nào đó tôi thay đổi thứ tự này mà không cập nhật các bài kiểm tra của tôi, các bài kiểm tra của tôi lý tưởng vẫn nên vượt qua. –
Vâng ... bạn đang đi vào trạng thái so với thử nghiệm hành vi một chút. Tôi không chắc chắn làm thế nào để trả lời câu hỏi mà không đưa ra giả định về kiến thức về thứ tự cuộc gọi. –
Nếu tôi hiểu chính xác, bạn không muốn có 'Assert.AreEqual (guid1, user.UserGuid); Assert.AreEqual (guid2, user.ConfirmationGuid); 'thất bại nếu bạn thay đổi thứ tự gán. Thay vào đó, bạn nên sử dụng một số loại bộ sưu tập khẳng định rằng độc lập với thứ tự (có sẵn trong cả nunit và mstest): 'CollectionAssert.AreEquivalent (new [] {guid1, guid2}, new [] {user.UserGuid, user.ConfirmationGuid}) ; ' –