tôi gặp phải một lớp học trong công việc của tôi trông như thế này:Tạo lai của mô hình và đối tượng ẩn danh bằng cách sử dụng ví dụ: Moq và AutoFixture?
public class MyObject
{
public int? A {get; set;}
public int? B {get; set;}
public int? C {get; set;}
public virtual int? GetSomeValue()
{
//simplified behavior:
return A ?? B ?? C;
}
}
Vấn đề là tôi có một số mã truy cập A, B và C và gọi phương thức GetSomeValue() (bây giờ, tôi muốn nói đây không phải là một thiết kế tốt, nhưng đôi khi tay tôi bị trói ;-)). Tôi muốn tạo ra một mô hình của đối tượng này, trong đó, cùng một lúc, có A, B và C được đặt thành một số giá trị. Vì vậy, khi tôi sử dụng moq như vậy:
var m = new Mock<MyObject>() { DefaultValue = DefaultValue.Mock };
phép tôi thiết lập một kết quả trên GetSomeValue() phương pháp, nhưng tất cả các thuộc tính được thiết lập để null (và thiết lập tất cả trong số họ sử dụng Cài đặt() là khá cồng kềnh, vì đối tượng thực là một đối tượng dữ liệu khó chịu và có nhiều thuộc tính hơn trong ví dụ đơn giản ở trên).
Vì vậy, mặt khác, sử dụng AutoFixture như thế này:
var fixture = new Fixture();
var anyMyObject = fixture.CreateAnonymous<MyObject>();
Lá tôi không có khả năng stup một cuộc gọi đến GetSomeValue() phương pháp.
Có cách nào để kết hợp cả hai, để có giá trị ẩn danh và khả năng thiết lập kết quả cuộc gọi không?
Sửa
Dựa trên câu trả lời nemesv, tôi có nguồn gốc phương pháp hữu ích sau đây (hy vọng tôi đã nhận nó đúng):
public static Mock<T> AnonymousMock<T>() where T : class
{
var mock = new Mock<T>();
fixture.Customize<T>(c => c.FromFactory(() => mock.Object));
fixture.CreateAnonymous<T>();
fixture.Customizations.RemoveAt(0);
return mock;
}
Đây là một giải pháp tốt, đặc biệt vì nó bao gồm các loại lồng nhau, cho nó chung chung với các loại lồng nhau, có cách nào để loại bỏ phần: t == typeof (MyObject) | | t == typeof (MyParent)? Logic tôi đang nghĩ đến là một cái gì đó như: "nếu loại lồng nhau của lai là mockable, làm cho nó một lai, khác làm cho nó một giá trị vô danh". –
Có, chỉ cần thay thế vị từ bằng một cái gì đó tổng quát hơn. –
Cảm ơn! Tôi cố gắng sử dụng một vị từ của (t! = Null &&! T.IsPrimitive && (t.GetConstructors (BindingFlags.Public) .Length! = 0 || t.GetConstructor (Type.EmptyTypes)! = Null)) và có vẻ như làm việc! Bạn có thấy cái gì thiếu ở đây không? Tôi sẽ cố gắng thử nghiệm một chút và cố gắng cho bạn biết nếu có bất cứ điều gì xảy ra. –