我正在学习单元测试,我使用Nsubstitute作为模拟框架的选择。 所以我有一个小假想的应用程序,我正在写一个客栈。我想写 测试,以确保一旦在星期五预订,房价应该是 折扣20%。但我不明白这个Nsubstitute是如何工作的(请记住你 学习)所以我认为使用when()do()应该可以帮助我测试我的目标。 有人可以帮我理解Nsubstitute框架的when()do()方法吗? 我该如何完成此测试?希望你们都能帮忙!!
public void DiscountRoomPricesAtWeekends(){
//Arrange
//prices at weekends should be discounted by 20%
//get price of a particular room and discount price
var roomprice = new Rooms() { Price = 100M };
//if day to check in is a friday or saturday its 20% off
var reserve = Substitute.For<Reservation>();
//Make sure that the date of reservation is always friday.
//reserve.ReservationDate.DayOfWeek.Returns(DayOfWeek.Friday);
//(double) roomprice.Price * 0.20)
var percentage = (double) roomprice.Price * 0.20;
reserve.When(r => r.ReservationDate.DayOfWeek.Returns(DayOfWeek.Friday))
.Do(p => );
//Act
//Assert
//Assert.AreEqual(percentage, 20);
Assert.AreEqual();}
谢谢大家
答案 0 :(得分:1)
我无法从您的示例中准确地告诉您要测试的内容。如果您发布了您要测试的代码,我可能会帮助您提供一种测试方法。
就一般的学习单元测试和特别是模拟库而言,我建议首先测试而不是模拟库。开始为您感兴趣的类/类集编写测试。在此过程中您可能会发现难以可靠测试的位(它们依赖于当前日期/时间,数据库,随机数,Web请求等) 。处理此问题的一种方法是将这些棘手的位与正在测试的其余代码隔离开来。
如何做到这一点的一些例子是:
DateTime.Now
内调用GetRoomPrice()
,而是更改代码以获取查询的日期:GetRoomPrice(DateTime bookingDate)
。GetAvailableRooms()
需要访问数据库,则可以创建一个传递给正在测试的类的RoomLookup
类/接口。对于测试,传入假的版本,返回GetAvailableRooms()
的硬编码值。在我的情况下,一旦我做了后者一段时间,手动实现这些假类变得乏味。那么现在似乎是从手动实现这些虚假类转换到模拟库(Moq,FakeItEasy,NSubstitute等等)的好时机,这将自动化该过程。在幕后,模拟库正在做与我们以前手动操作类似的事情。根据我的经验,这种方法使得模拟库更容易理解。
那就是说,你可能更喜欢&#34;传递价值观&#34;方法,在这种情况下,你可能会完全不需要模拟库! (或者不经常需要它们,手工编写假类更容易。)
希望这有帮助。