簡體   English   中英

使用nsubstitute存根接口之類的方法

[英]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將調用FormatModelBasketModel從映射器返回。 如果您需要在測試中復制某些實現(同樣,通常不建議這樣做),則可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM