2015-09-21 53 views
0

我想问下面的方法什么是一个好的单元测试GetMeetingsByInterimIdentifier其中临时标识符是一个字符串 - 比如78th2015。如何进行单元测试而不碰到数据库

我们设置为使用接口IMeetingsService。我们正在使用MOQ和Microsoft.VisualStudio.TestTools.UnitTesting。

public class MeetingsService : IMeetingsService 
{ 
    private readonly IInterimCommitteeDbContext _db; 

    public MeetingsService(IInterimCommitteeDbContext db) 
    { 
     this._db = db; 
    } 

    public IQueryable<Meeting> GetMeetingsByInterimIdentifier(string interimIdentifier) 
    { 
     return 
      from m in this._db.Meetings 
      join c in this._db.Committees on m.CommitteeId equals c.CommitteeId 
      where c.InterimIdentifier == interimIdentifier 
      select m; 
    } 

    public Meeting GetMeeting(int meetingKey) 
    { 
     return this._db.Meetings.FirstOrDefault(x => x.MeetingId == meetingKey); 

    } 

} 

编辑:

但我不知道如何设置它。这个结果不是null,但它对我有什么作用?

[TestMethod] 
public void GetMeetingsByInterimIdentifier_WithInterimIdentifier_ReturnsMeetingList() 
{ 
    //Arrange 
    var interim = Properties.Settings.Default.DefaultInterimIdentifier; 
    var result = _meetingServiceMock.Setup(x => x.GetMeetingsByInterimIdentifier(interim)); 

    //Act 

    //Assert 
    Assert.IsNotNull(result); 
} 
+0

我可能不会打扰单元测试此。您正在测试基于过滤器('interimIdentifier')从EF返回数据库对象。在执行LINQ语句后,您的代码不会处理结果,因此您最好创建实际触及数据库的集成测试。 – levelnis

回答

0

使用Mocking,就是这样。使用JMockMockito或您喜欢的任何其他库。

+0

这不是一个答案,更重要的是;你提供的OP是一个不相关的框架,因为他使用'C#'而不是'Java',并且在单行中不是一个答案... –

0

创建一个Mock<IInterimCommitteeDbContext>并将其传递给构造函数。在此对象上设置MeetingsCommittees属性以返回各种集合。

你应该有不同的测试设置,返回不同的集合。例如,如果MeetingsCommittees都为空,即数据库中没有数据,这应该如何表现?如果没有提供InterimIdentifier的对象,它应该如何处理?怎么样,如果有一个匹配等。

+0

但我不确定如何设置它。这不起作用: – kfwbird

+0

也许你可以添加你到目前为止的问题,或者用你已有的东西创建一个新的问题? – TomDoesCode

+0

但我不知道如何设置它。这个结果不是null,但它对我有什么作用? [TestMethod的] 公共无效GetMeetingsByInterimIdentifier_WithInterimIdentifier_ReturnsMeetingList() { //排列 变种临时= Properties.Settings.Default.DefaultInterimIdentifier; var result = _meetingServiceMock.Setup(x => x。GetMeetingsByInterimIdentifier(临时)); // Act //断言 Assert.IsNotNull(result); } – kfwbird

0

我想通过测试双打如何做到这一点。我使用实体框架6和代码优先模型。我创建了一个从我的I-DbContext接口继承的DbContext。然后我能够创建内存数据以用于我的服务层单元测试。下面是一个例子:

  1. 测试数据上下文,
  2. 测试dbset,
  3. 一个例子的单元测试。

该解决方案提供了从MSDN文章在这里: https://msdn.microsoft.com/en-us/data/dn314429.aspx ...

 
     public class CommitteeContextTest : ICommitteeDbContext 
     { 
      public CommitteeContextTest() 
      { 
       this.Committees = new TestDbSet(); 
       this.CommitteeMembers = new TestDbSet(); 
      } 
      public Database Database { get; } 
      public DbSet Committees { get; set; } 
      public DbSet CommitteeMembers { get; set; } 
     } 
    } 

 
public class TestDbSet : DbSet, IQueryable, IEnumerable, IDbAsyncEnumerable 
      where TEntity : class 
    { 
     ObservableCollection _data; 
     IQueryable _query; 

     public TestDbSet() 
     { 
      _data = new ObservableCollection(); 
      _query = _data.AsQueryable(); 
     } 

     public override TEntity Add(TEntity item) 
     { 
      _data.Add(item); 
      return item; 
     } 

     public override TEntity Remove(TEntity item) 
     { 
      _data.Remove(item); 
      return item; 
     } 

     public override TEntity Attach(TEntity item) 
     { 
      _data.Add(item); 
      return item; 
     } 

     public override TEntity Create() 
     { 
      return Activator.CreateInstance(); 
     } 
    } 

    [TestClass] 
    public class CommitteeServiceTest 
    { 
     private InterimCommitteeContextTest _interimCommitteeContext; 
     private ICommitteeService _service; 
     private string _interim; 

     [TestInitialize] 
     public void SetUp() 
     { 
      _interimCommitteeContext = new InterimCommitteeContextTest(); 
      _service = new CommitteeService(_interimCommitteeContext); 
      _interim = Settings.Default.DefaultInterimIdentifier; 
     } 

     [TestCleanup] 
     public void Teardown() 
     { 
      _interimCommitteeContext = null; 
      _service = null; 
     } 

     [TestMethod] 
     public void GetCommittee_ProvideInterimCommitteeId_ReturnOneCommittee() 
     { 
      //Arrange 
      AddCommittees(); 

      //Act and Assert 
      var result = _service.GetCommittee(_interim, 1); 
      Assert.AreEqual(1, result.CommitteeId); //Passes. IsActive set to true; 
      result = _service.GetCommittee(_interim, 0); 
      Assert.IsNull(result); //Fails. No committeeId = 0; 
      result = _service.GetCommittee(_interim, 2); 
      Assert.IsNull(result); //Fails. CommitteeId = 2 is not active. 
     } 

     [TestMethod] 
     public void AddCommittees() 
     { 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 1, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 }); 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 2, InterimIdentifier = _interim, IsActive = false, CommitteeTypeId = 1 }); 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 3, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 }); 
     } 
    }