[asp.net]毫无意义的单元测试

发布时间: 2017/3/26 5:36:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个 baseService 类继承的大部分我的服务,看上去就像这。

public abstract class BaseService<T> : IBaseService<T>
    where T : class, IBaseEntity
{
    protected IDataContext _context;
    protected IValidator<T> _validator = null;

    protected BaseService(IDataContext context)
    {
        _context = context;
    }

    protected BaseService(IDataContext context, IValidator<T> validator)
        : this(context)
    {
        _validator = validator;
    }

    public virtual async Task<ICollection<T>> GetAllAsync()
    {
        return await _context.Set<T>().ToListAsync();
    }

    public virtual Task<T> GetAsync(long id)
    {
        return _context.Set<T>().Where(e => e.Id == id).FirstOrDefaultAsync();
    }

    public virtual Task<ValidationResult> ValidateAsync(T t)
    {
        if (_validator == null) throw new MissingFieldException("Validator does not exist for class " + t.GetType().ToString() + ". override method if no validation needed");
        return _validator.ValidateAsync(t);
    }

    public virtual async Task<int> AddAsync(T t)
    {
        var results = await ValidateAsync(t);

        if (!results.IsValid) {
            throw new ValidationException(results.Errors);
        }

        if (_context.GetState(t) == EntityState.Detached)
        {
            _context.Set<T>().Add(t);
            _context.SetState(t, EntityState.Added);
        }

        return await _context.SaveChangesAsync();
    }

    public virtual async Task<int> UpdateAsync(T updated)
    {
        var results = await ValidateAsync(updated);

        if (!results.IsValid)
        {
            throw new ValidationException(results.Errors);
        }

        if (_context.GetState(updated) == EntityState.Detached)
        {
            _context.SetState(updated, EntityState.Modified);
        }

        return await _context.SaveChangesAsync();
    }

    public virtual Task<int> DeleteAsync(T t)
    {
        _context.SetState(t, EntityState.Deleted);

        return _context.SaveChangesAsync();
    }
}

上午我的想法是毫无意义单位对测试这在每一个我的类实现此服务吗? 但相反,在我集成测试测试对于每个测试功能?

解决方法 1:

如果你选择组合而非继承,则可以避免这一决定,那就是,而不是从 BaseService 继承您服务,它们创建为具有 IBaseService 作为一个依赖项,例如

public class MyService 
{
  private readonly IBaseService<SomeBaseIdentity> _service;

  public MyService(IBaseService<SomeBaseIdentity> service)
  {
    _service = service;
  }

  //.... methods that use _service
}

这种方式你可以测试 MyService 使用隔离框架 (犀牛嘲弄、 最小起订量等) 而不用担心 IBaseService 的实际实现。

关于本主题的选择组成,而不是继承已经写了很多。其中绝大多数意味着它是一种高级方法 (主要是因为它是更灵活,即可以交换实现如果你使用组成,而如果你使用继承所有派生的类都息息相关的意义上对基类的更改影响所有派生的类的基类),到了 Java 语言创造者说,如果他能他将不允许它在 Java

官方微信
官方QQ群
31647020