Tôi chưa từng thực hiện kiểm tra đơn vị trước đây, và tôi đã vấp ngã và vấp phải bài kiểm tra đầu tiên của mình. Vấn đề là _repository.Golfers.Count();
luôn cho biết rằng DbSet
trống.Kiểm tra đơn vị Khung thực thể với Mock IDbSet
thử nghiệm của tôi rất đơn giản, tôi chỉ cố gắng để thêm một tay golf mới
[TestClass]
public class GolferUnitTest //: GolferTestBase
{
public MockGolfEntities _repository;
[TestMethod]
public void ShouldAddNewGolferToRepository()
{
_repository = new MockGolfEntities();
_repository.Golfers = new InMemoryDbSet<Golfer>(CreateFakeGolfers());
int count = _repository.Golfers.Count();
_repository.Golfers.Add(_newGolfer);
Assert.IsTrue(_repository.Golfers.Count() == count + 1);
}
private Golfer _newGolfer = new Golfer()
{
Index = 8,
Guid = System.Guid.NewGuid(),
FirstName = "Jonas",
LastName = "Persson"
};
public static IEnumerable<Golfer> CreateFakeGolfers()
{
yield return new Golfer()
{
Index = 1,
FirstName = "Bill",
LastName = "Clinton",
Guid = System.Guid.NewGuid()
};
yield return new Golfer()
{
Index = 2,
FirstName = "Lee",
LastName = "Westwood",
Guid = System.Guid.NewGuid()
};
yield return new Golfer()
{
Index = 3,
FirstName = "Justin",
LastName = "Rose",
Guid = System.Guid.NewGuid()
};
}
tôi đã xây dựng một mô hình dữ liệu sử dụng Entity Framework và mã đầu tiên. Tôi đã chế giễu một lớp được thừa kế cho IDbSet để kiểm tra bối cảnh của tôi (chào người nào cho người dân trực tuyến mà tôi không thể nhớ chính xác)
public class InMemoryDbSet<T> : IDbSet<T> where T : class
{
readonly HashSet<T> _set;
readonly IQueryable<T> _queryableSet;
public InMemoryDbSet() : this(Enumerable.Empty<T>()) { }
public InMemoryDbSet(IEnumerable<T> entities)
{
_set = new HashSet<T>();
foreach (var entity in entities)
{
_set.Add(entity);
}
_queryableSet = _set.AsQueryable();
}
public T Add(T entity)
{
_set.Add(entity);
return entity;
}
public int Count(T entity)
{
return _set.Count();
}
// bunch of other methods that I don't want to burden you with
}
Khi tôi gỡ lỗi và bước qua đoạn code tôi có thể thấy rằng tôi nhanh chóng _repository
và điền nó với ba người chơi golf giả, nhưng khi tôi bước ra khỏi chức năng thêm, các _respoistory.Golfers
là sản phẩm nào một lần nữa. khi tôi thêm một tay golf mới, số _set.Add(entity)
chạy và người chơi golf được thêm vào, nhưng một lần nữa _respoistory.Golfers
thì trống. Tôi đang thiếu gì ở đây?
Cập nhật
Tôi xin lỗi vì một thằng ngốc, nhưng tôi đã không được thực hiện các set
trên MockGolfEntities
bối cảnh của tôi. Lý do tôi đã không phải là tôi đã thử trước đây nhưng không thể tìm ra cách, tiếp tục, và quên nó đi. Vì vậy, làm cách nào để đặt một số IDbSet
? Đây là những gì tôi đã thử, nhưng nó mang lại cho tôi một lỗi Stack Overflow. Tôi cảm thấy như một thằng ngốc, nhưng tôi không thể tìm ra cách để viết chức năng thiết lập.
public class MockGolfEntities : DbContext, IContext
{
public MockGolfEntities() {}
public IDbSet<Golfer> Golfers {
get {
return new InMemoryDbSet<Golfer>();
}
set {
this.Golfers = this.Set<Golfer>();
}
}
}
Phương thức 'set' đang tự gọi bằng cách gán cho' this.Golfers'. Bạn nên lưu trữ giá trị ở đâu đó. Ví dụ: 'this.golfers = value;' trong đó 'gôn thủ' là một trường riêng (' IDBSet người chơi golf riêng; '). –
Sam