gpt4 book ai didi

c# - 使用最小起订量和存储库模式进行单元测试

转载 作者:太空狗 更新时间:2023-10-29 19:55:54 26 4
gpt4 key购买 nike

我是单元测试的新手,我需要一些帮助。我首先使用带有存储库模式的代码。我有一个通用存储库,其中包含称为通用存储库的通用 CRUD 操作(见下文)

 public abstract class GenericRepository<T> where T : class
{
private HolidayDatabaseContext _dataContext;
private readonly IDbSet<T> _dbset;
protected GenericRepository(IDbFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
_dbset = DataContext.Set<T>();
}
protected IDbFactory DatabaseFactory
{
get;
private set;
}
protected HolidayDatabaseContext DataContext
{
get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
}

public virtual void Add(T entity)
{
_dbset.Add(entity);
}
public virtual void Update(T entity)
{
_dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
_dbset.Remove(entity);
}
public virtual IEnumerable<T> Enumerable()
{
return _dbset.AsEnumerable<T>();
}

public virtual IQueryable<T> List()
{
return _dbset.AsQueryable<T>();
}

public virtual T GetSingleById(int id)
{
return _dbset.Find(id);
}

public void Save()
{
_dataContext.SaveChanges();
}

}

然后我将它继承到用户存储库中并创建了一些特定的方法。见下文

public class UserRepository : GenericRepository<User>, IUserRepository
{
public UserRepository(IDbFactory databaseFactory)
: base(databaseFactory) { }


public int HolidayEntitlement(int userId)
{
return HolidayEntitlement(userId, DateTime.Now);
}
public int HolidayEntitlement(int userId, DateTime dateTime)
{
//Get the User
var user = this.GetSingleById(userId);

//Work Total Entitlement
int entitlement = user.BaseHolidayEntitlement;

//Years in Service
entitlement += (dateTime - user.EmploymentStartDate).Days / 365;

return entitlement;



}


public int RemainingHolidayEntitlement(int userId)
{
return RemainingHolidayEntitlement(userId, DateTime.Now);
}

public int RemainingHolidayEntitlement(int userId, DateTime dateTime)
{
return int.MinValue;
}
}

我想对 HolidayEntitlement(int userId, DateTime dateTime) 进行单元测试,但我需要模拟方法中的 GetSingleById 部分

我已经将其编写为测试,但无法编译。

 [TestMethod]
public void GetHolidayEntitlement25()
{
//How to write this Unit test


//Setup
var user = new User { AnnualHolidayIncrement = 1, BaseHolidayEntitlement = 25, EmploymentStartDate = new DateTime(2013, 1, 1),Id=1 };

Mock<UserRepository> mock = new Mock<UserRepository>();
mock.Setup(m => m.GetSingleById(1)).Returns(user);

Assert.AreEqual(25, mock.Object.HolidayEntitlement(1));
}

任何帮助将不胜感激

最佳答案

您似乎是在说您只想模拟部分界面。当你开始遇到这种情况时,它表明你正在混淆你的担忧并且可能在某处做错了什么。

在这种情况下,您的存储库所做的很多不仅仅是 CRUD,因此具有多重职责(它应该只有一个,查找 SOLID 编程)。您正在存储库中执行业务逻辑,它不应该存在于那里!除了简单的 CRUD 操作之外的任何东西都应该移出到业务逻辑层。 IE。您的 HolidayEntitlement 方法通过应用某些逻辑来计算某些内容,因此不是 CRUD/存储库操作!

所以...您应该做的是将业务逻辑位移出到一个新类中,比如 UserLogic。在 UserLogic 类中,您将使用注入(inject)的 IUserRepository 与您的存储库通信。在 UserLogic 中,您可以放置​​ HolidayEntitlement 方法,它会调用 IUserRepository.GetSingleById。因此,当您随后测试您的 UserLogic 类时,您将注入(inject)您的模拟 IUserRepository ,它将具有 GetSingleById 的 stub 版本,然后您将回到正确的轨道上!

我希望这有意义/有帮助?!

--原帖--

附言我原来的帖子说你应该模拟接口(interface),而不是实例,所以这仍然适用,我将留在这里供引用:

你应该模拟 IUserRepository NOT UserRepository

那是因为UserRepositoryIUserRepository 的实现。你想说你正在给它一个新的实现,即你的模拟。目前您正在使用 ACTUALUserRepository

关于c# - 使用最小起订量和存储库模式进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com