2012-08-03 36 views
10

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>(); 
     } 
    } 
} 
+0

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

Trả lời

5

Bạn không cần phải triển khai get/set, mã sau đủ để tạo ngữ cảnh cho bạn.

public class MockGolfEntities : DbContext, IContext 
{ 
    public MockGolfEntities() {} 

    public IDbSet<Golfer> Golfers { get; set;} 

} 

Tôi đã triển khai mã bạn đã có trong bài đăng gốc và mọi thứ dường như hoạt động tốt cho tôi - bạn đã lấy nguồn cho InMemoryDbSet ở đâu? Tôi đang sử dụng NuGet package 1.3, có thể bạn nên thử phiên bản đó?

+0

Cảm ơn- Tôi vẫn còn bối rối về việc làm thế nào để thực hiện các thiết lập nếu tôi muốn, nhưng tôi vui mừng để lại phép thuật lên đến IDbSet. Tôi nhận ra thiết lập của tôi là điên, vì tôi đang cố gắng để thiết lập các tài sản trong một vòng lặp vô hạn, nhưng tôi đã tuyệt vọng và muốn đăng một số mã để cho thấy rằng tôi ít nhất đã cho nó một shot :-). Tôi không sử dụng NuGet, nhưng tôi đang cố gắng sử dụng nó. Cảm ơn các liên kết. –