这些单元测试是否正常?

ale*_*exn 4 .net c# tdd unit-testing mocking

我正在努力掌握测试驱动的开发,我想知道这些单元测试是否合适.我有一个看起来像这样的界面:

public interface IEntryRepository
{
    IEnumerable<Entry> FetchAll();
    Entry Fetch(int id);
    void Add(Entry entry);
    void Delete(Entry entry);
}
Run Code Online (Sandbox Code Playgroud)

然后这个实现该接口的类:

public class EntryRepository : IEntryRepository
{
    public List<Entry> Entries {get; set; }

    public EntryRepository()
    {
        Entries = new List<Entry>();
    }

    public IEnumerable<Entry> FetchAll()
    {
        throw new NotImplementedException();
    }

    public Entry Fetch(int id)
    {
        return Entries.SingleOrDefault(e => e.ID == id);
    }

    public void Add(Entry entry)
    {
        Entries.Add(entry);
    }

    public void Delete(Entry entry)
    {
        Entries.Remove(entry);
    }
}
Run Code Online (Sandbox Code Playgroud)

Theese是我到目前为止所写的单元测试,它们是好还是我应该做些不同的事情?我应该嘲笑EntryRepository吗?

[TestClass]
public class EntryRepositoryTests
{
    private EntryRepository rep;

    public EntryRepositoryTests()
    {
        rep = new EntryRepository();
    }

    [TestMethod]
    public void TestAddEntry()
    {
        Entry e = new Entry { ID = 1, Date = DateTime.Now, Task = "Testing" };
        rep.Add(e);

        Assert.AreEqual(1, rep.Entries.Count, "Add entry failed");
    }

    [TestMethod]
    public void TestRemoveEntry()
    {
        Entry e = new Entry { ID = 1, Date = DateTime.Now, Task = "Testing" };
        rep.Add(e);

        rep.Delete(e);
        Assert.AreEqual(null, rep.Entries.SingleOrDefault(i => i.ID == 1), "Delete entry failed");
    }

    [TestMethod]
    public void TestFetchEntry()
    {
        Entry e = new Entry { ID = 2, Date = DateTime.Now, Task = "Testing" };
        rep.Add(e);

        Assert.AreEqual(2, rep.Fetch(2).ID, "Fetch entry failed");
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ste*_*ers 7

就在我的头顶......

虽然你对add的测试真的只测试框架:

  • 你已经添加了1项,这很好
  • 那么添加很多项目(我的意思是,荒谬的数量 - 容器添加的n个条目的值是多少?)
  • 怎么样没有添加项目?(空条目)
  • 如果您将项目添加到列表中,它们是否按特定顺序排列?他们应该吗?

同样与你的获取:

  • 如果x> rep.Count,你的fetch(x)会发生什么?
  • 如果x <0会发生什么?
  • 如果代表是空的,会发生什么?
  • x是否符合性能要求(它的算法复杂度是什么?当只有一个条目并且存在大量条目时,它是否在范围内?

实用单元测试一书中有一个很好的清单(好书,强烈推荐)

  • 结果对吗?
  • 所有的边界条件都是正确的
    • 符合预期的格式
    • 订购正确
    • 在合理的范围内
    • 它是否引用任何外部依赖项
    • 基数是否正确?(正确的数值)
    • 是否以正确的时间(真实或相对)完成
  • 你能检查反向关系吗?
  • 你能用另一种经过验证的方法交叉检查结果吗?
  • 你能强制出错吗?
  • 性能特征是否在界限范围内