簡體   English   中英

未從 sut 調用 Mocked object 中的方法

[英]Method in Mocked object is not called from sut

我為我的紙牌游戲制作 MSTests。 我有 Player class (它取決於IStrategy接口),它有一個調用interface.Attack()方法的方法Attack() 創建Mock<IStrategy>並設置strategy.Attack() 但是當Player.Attack被調用時, mock.Attack不會被調用。

我做錯了什么?

    public class Player : IPlayer
    {
        public List<Card> CardsOnHands { get; }
        public IStrategy Strategy { get; }

        public Player(IStrategy strategy)
        {
            Strategy = strategy;
            CardsOnHands = new List<Card>();
        }

        public Card Attack(List<Card> CardsOnTable)
        {
           return Strategy.Attack(CardsOnHands, CardsOnTable);
        }
    }

我的測試如下

    [TestMethod]
    public void PlayerAttackShouldReturnCard()
    {
        //Arrange
        var StrategyMock = new Mock<IStrategy>();
        ExpectedCard = new Card(1, "fakeName", "fakeSuit", true);
        CardList = new List<Card>
        {
        new Card(1, "", "", true),
        new Card(1, "", "", true),
        new Card(1, "", "", true)
        };

        StrategyMock
            .Setup(x => x.Attack(CardList, CardList))
            .Returns(ExpectedCard);
        var _player = new Player (StrategyMock.Object);
        //Act
        Card actualCard = _player.Attack(CardList);
        //Assert
        StrategyMock.Verify(x => x.Attack(CardList, CardList), Times.Exactly(1));
        Assert.AreEqual(ExpectedCard, actualCard);
    }

Verify失敗

您必須將模擬接口顯式注入主題 class ( _player )。

當前示例未顯示您在哪里執行此操作。

它需要看起來像

[TestMethod]
public void PlayerAttackShouldReturnCard() {
    //Arrange
    var strategyMock = new Mock<IStrategy>();
    var expectedCard = new Card(1, "fakeName", "fakeSuit", true);
    var tableCards = new List<Card> {
        new Card(1, "", "", true),
        new Card(1, "", "", true),
        new Card(1, "", "", true)
    };

    strategyMock
        .Setup(x => x.Attack(It.IsAny<List<Card>>(), tableCards))
        .Returns(expectedCard)
        .Verifiable();

    Player _player = new Player(strategyMock.Object); //<--- explicit injection here

    //Act
    Card actualCard = _player.Attack(TableCards);

    //Assert
    strategyMock.Verify();
    Assert.AreEqual(expectedCard, actualCard);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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