【问题标题】:Moq for single line multiple property code单行多属性代码的起订量
【发布时间】:2017-08-29 21:31:02
【问题描述】:

我有这些接口

public interface Interface1 { Interface2 Items {get;} }
public interface Interface2 { Guid? ApplicationTypeId { get; } }
public interface Interface3 { Class1 Item {get;} }
public interface Interface4 { Guid? ApplicationId { get; set; } }

一个类继承第一个接口

public class Class1 : Interface1 {
   public Interface2 Items { get; }
}

另一个由几个 guid 组成的类

public static class ContentTypeIds
{
    public static Guid ContentGuid1 => new Guid("{11798e9d-a167-4cfc-8cfa-9a24fd6caf25}");

    public static Guid ContentGuid2 => new Guid("{7d22f5bb-37fd-445a-b322-2fa1b108d260}");
}

我需要对以下属性进行单元测试

private readonly Interface3 _interface3;
public Ticket Current
{
   get
   {
      //This line is very complicated
      Interface4 itemByContentType = _interface3.Item?.Items.GetItemByContentType(ContentTypeIds.ContentGuid2);
      if ( itemByContentType?.ContentId != null )
          return Get(itemByContentType.ContentId.Value);
      return null;
   }
}

我的测试课在这里

[Test]
public class TestClass {
    var mock1 = new Mock<Interface1>();
    var mock2 = new Mock<Interface2>();
    var mock3 = new Mock<Interface3>();

    mock1.SetupAllProperties();
    mock2.SetupAllProperties();
    mock3.SetupAllProperties();
}

“itemByContentType”的值变为空。 任何人都可以帮助我使它变得简单和可测试,因为测试这个属性变得越来越复杂?我正在使用起订量。我将不胜感激。

谢谢

【问题讨论】:

    标签: c# moq


    【解决方案1】:

    我不是 Moq 方面的专家,但它的 SetupAllProperties 方法似乎只是将所有属性设置为像属性一样(即它创建的对象有一个可以支持 GET 的持久成员/SET 操作)。如果不这样做,那么据我了解,这些属性仍然可用,但它们总是会解析为 null。这在准备 Mock 对象时非常方便,但它本身并不会为属性设置任何类型的值。

    我认为您应该做的是使用 Moq 的 SetupGet 结合 Returns 方法来准备具有特定值的 Items 属性的 GET。

    这里有一些(简化的)示例代码,用于演示:

    public interface IFoo { Guid? ApplicationId { get; set; } }
    public interface IBar { IFoo Items { get; } }
    
    class Program
    {
    
        static void Main(string[] args)
        {
            // SETUP
            // Prepare mocks
            Mock<IFoo> MockFoo = new Mock<IFoo>();
            Mock<IBar> MockBar = new Mock<IBar>();
    
            // Seting up properties allows us read/write Foo's ApplicationId
            MockFoo.SetupAllProperties();
    
            // The mocked Foo object should be what's returned when Items is requested
            var expectedFoo = MockFoo.Object;
    
            // Setup the Bar object to return that mocked Foo
            MockBar.SetupGet(x => x.Items).Returns(expectedFoo);
    
            // The value written here will be persistent due to SetupAllProperties
            expectedFoo.ApplicationId = new Guid("{7d22f5bb-37fd-445a-b322-2fa1b108d260}");
    
    
    
    
            // ACTION
            // When the "Items" property is accessed, the IFoo we get should be what we mocked...
            var actualFoo = MockBar.Object.Items;
    
            // ... and we can read the value set to Foo's ApplicationId
            var actualAppId = actualFoo.ApplicationId;
        }
    }
    

    【讨论】:

    • 谢谢史蒂文。简化测试代码后,我的问题变得更简单了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2023-04-02
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多