代码之家  ›  专栏  ›  技术社区  ›  Francis B.

用moq模拟与函数内部数据源的连接?

  •  2
  • Francis B.  · 技术社区  · 15 年前

    我开始使用moq,我不知道如何测试这个方法 执行 在下面的代码中:

    我有以下课程:

    public class MyObject {
        private IDataReaderPlugin m_source;
        private IDataWriterPlugin m_dest;
        private string[] m_dummyTags = new string[] { "tag1", "tag2", "tag3"};
    
        public void Execute(DateTime time)
        {
            DataCollection tags = m_source.SnapshotUtc(m_dummyTags, time);
    
            //Doing some treatment on the values in tags    
    
            m_dest.Write(tags); 
        }
    

    }

    另一个方法负责根据配置文件中的信息创建和初始化IDataReaderPlugin和IDataWriterPlugin。

    我想测试方法执行。所以,我需要嘲笑 MY-源 最大的 在我想测试结果后发送给 最大的 .

    我怎样才能通过MoQ实现这一目标?

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   rball    15 年前

    这应该让你开始:

    DateTime myDate = DateTime.Now;
    
    DataCollection tags = new DataCollection();
    
    Mock<IDataReaderPlugin> dataReaderPlugin = new Mock<IDataWriterPlugin>();
    dataReaderPlugin.Setup(drp => drp.SnapshotUtc(It.IsAny<string[]>(), myDate)).Returns(tags);
    
    Mock<IDataWriterPlugin> dataWriterPlugin = new Mock<IDataWriterPlugin>();
    dataWriterPlugin.Setup(dwp => dwp.Write(tags);    
    
    MyObject mo = new MyObject();
    mo.Execute();
    
    mock.Verify(foo => foo.Write(tags));
    
        2
  •  4
  •   womp    15 年前
    [Test]
    public void ShouldWriteToMDest()
    {
       // Arrange
       var mockDest = new Mock<IDataWriterPlugin>();
       var mockSource = new Mock<IDataReaderPlugin>();
       string[] m_dummyTags = new string[] { "tag1", "tag2", "tag3"};
    
       mockSource.Setup(source => source.SnapshotUtc(m_dummyTags, It.IsAny<DateTime>()).Returns(/*whatever you need*/);
    
       var myObj = new MyObject(mockSource.Object, mockDest.Object);
    
       // Act
       myObj.Execute(DateTime.Now);
    
    
       // Assert
       Assert.That(mockSource.Object.WhateverPropertyContainsOutput == /*Whatever you need */);
    
    }
    
        3
  •  2
  •   thatismatt    15 年前

    “另一种方法负责” -这是关键的一点信息。如果您使用的是IOC或DI框架,那么您需要插入一些接口的moq模拟。 IDataReaderPlugin IDataWriterPlugin . 然后 Execute 方法将使用IOC/DI框架提供的这些模拟。

    如果它们只是由一个setter或属性设置的,那么它的简单程度如下:

    // Arrange
    var mo = new MyObject();
    var srcMock = new Mock<IDataReaderPlugin>();
    src.Setup(src => src.SnapshotUtc(It.IsAny<string[]>(), It.IsAny<DateTime>()))
       .Returns(new DataCollection() /* or whatever */);
    mo.SetSource(srcMock.Object);
    // ... same for m_dest
    // Act
    mo.Execute(DateTime.Now);
    // Assert
    // assert something... srcMock.Verify() or whatever