![](/img/trans.png)
[英]Using NSubstitute is it possible to mock/stub a base class virtual method?
[英]stub out a method like an interface using nsubstitute
這是我的第一篇文章!
我正在嘗試使用nsubstitute編寫單元測試,但發現最后一點困難。
我在下面包含了一段代碼,調用模型上的方法時測試失敗。 可以將這種方法存根嗎? 類似於它是一個接口
大家好! 期待您的回應
詹姆士
我的單元測試嘗試
public class MyTests
{
private IModelMapper _modelMapper;
[SetUp]
public void Setup()
{
_modelMapper = Substitute.For<IModelMapper>();
}
[Test]
public void GetModel_Returns_A_Model()
{
var result = theClass.GetModel(new Booking {CurrencyCode = ""}, null);
**UPDATE to include assert**
// Assert
Assert.IsInstance<BasketModel>(result);
}
}
功能碼
public Model GetModel(Booking booking)
{
var model = _modelMapper.Map(booking);
// Is it possible to stub this out? Similar to if it was an interface
model.FormatPricing(somethingHere);
return model;
}
更新-說明返回類型
BasketModel model = _modelMapper.Map(booking);
更新#2-包含返回
var basketModel = new BasketModel();
BasketModel model = _modelMapper.Map(booking).Returns(basketModel);
您可以輸入收到的測試失敗消息嗎?
這是我傾向於采用這種代碼的一般方法。 假設我們正在將IModelMapper
注入IModelMapper
類(近似代碼;我尚未測試):
[SetUp]
public void Setup()
{
_modelMapper = Substitute.For<IModelMapper>();
theClass = new TheClass(_modelMapper);
}
[Test]
public void GetModel_Returns_Model_From_Mapper()
{
// Arrange
var booking = new Booking { CurrencyCode = "" };
var expectedModel = new BasketModel();
_modelMapper.GetModel(booking).Returns(expectedModel);
// Act
var result = theClass.GetModel(booking, null);
// Assert
Assert.AreSame(expectedModel, result);
}
如果要BasketModel.FormatModel
(這是一個很大的“ if”。如果可能的話,我建議您使用實型),那么您也將要替換BasketModel
。
請注意-NSubstitute不適用於非虛擬方法 ,因此您可能需要BasketModel
的接口,或者只是確保在所有地方都使用虛擬。 (再次,未經測試的代碼在前)
[Test]
public void ModelReturnedShouldBeFormatted()
{
// Arrange
var booking = new Booking { CurrencyCode = "" };
var expectedModel = Substitute.For<IBasketModel>();
_modelMapper.GetModel(booking).Returns(expectedModel);
// Act
var result = theClass.GetModel(booking, null);
// Assert
expectedModel.Received().FormatModel(Arg.Any<SomethingHere>());
}
這是測試遵守特定的合同- TheClass
將調用FormatModel
在BasketModel
從映射器返回。 如果您需要在測試中復制某些實現(同樣,通常不建議這樣做),則可以使用When..Do
:
[Test]
public void FormatModel()
{
// Arrange
var booking = new Booking { CurrencyCode = "" };
var expectedModel = Substitute.For<IBasketModel>();
expectedModel
.When(x => x.FormatModel(Arg.Any<SomethingHere>()))
.Do(/* some action */);
_modelMapper.GetModel(booking).Returns(expectedModel);
// Act
var result = theClass.GetModel(booking, null);
// Assert
// assertion here that depends on "some action" and result
}
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.