【问题标题】:How to Moq a read only property which value depends on the the class method invoke?如何最小化一个只读属性,其值取决于类方法调用?
【发布时间】:2026-01-15 23:55:02
【问题描述】:

我有一个界面,类似这样的

public interface IContent 
{bool IsCheckedOut {get; };    
 void CheckOut(); 
}

CheckOut() 方法会影响 IsCheckedOut 属性返回的值。例如,在调用 CheckOut() 方法之前,IsCheckedOut 返回 false。之后,IsCheckedOut 属性返回 true。 我想测试类似这样的 CheckOut 方法

[TestMethod]
public void CheckOutSetsCheckedOutStatusToTrue()
{
    var content  =  new Mock <IContent>();    

  // test mock CheckOut() method, something like this
   content.Setup(x => x.CheckOut()); 
   content.Object.CheckOut();

   // Verify 
    Assert.AreEqual(true, content.IsCheckedOut); //Test works as expected
}

有人知道我该怎么做吗?

非常感谢。

【问题讨论】:

    标签: c# methods interface moq


    【解决方案1】:

    模拟可能不是最好的方法,编写一个实现接口的存根对象可能更容易为您提供所需的行为:

    public class CheckoutStub : IContent
    {
        public bool IsCheckedOut { get; private set; }
        public void CheckOut() { IsCheckedOut = true; }
    }
    

    模拟用于验证被测系统的行为,也许您只需要它作为输入。

    但是,您可以使用 Moq 创建存根,这通常只是更多的工作:

    var isCheckedOut = false;
    content.Setup(x => x.CheckOut()).Callback(() => { isCheckedOut = true; });
    content.SetupProperty(x => x.IsCheckedOut);
    

    【讨论】:

    • 非常感谢,c odekazein。以后我会使用存根的想法。
    【解决方案2】:

    试试这个:

    var isCheckedOut = false;
    content.Setup(x => x.CheckOut()).Callback(() => { isCheckedOut = true; });
    content.SetupGet(x => x.IsCheckedOut).Returns(() => isCheckedOut);
    content.Object.CheckOut();
    

    【讨论】:

      最近更新 更多