如何使用起订量来模拟一个SqlDataReader的 - 更新 [英] How to mock an SqlDataReader using Moq - Update
问题描述
我是新来的起订量,并设立嘲笑,所以我可以有一点帮助做的。我如何小样使用起订量的SqlDataReader的?
I'm new to moq and setting up mocks so i could do with a little help. How do I mock up an SqlDataReader using Moq?
更新
在进一步的测试,这是我有这么远:
After further testing this is what I have so far:
private IDataReader MockIDataReader()
{
var moq = new Mock<IDataReader>();
moq.Setup( x => x.Read() ).Returns( true );
moq.Setup( x => x.Read() ).Returns( false );
moq.SetupGet<object>( x => x["Char"] ).Returns( 'C' );
return moq.Object;
}
private class TestData
{
public char ValidChar { get; set; }
}
private TestData GetTestData()
{
var testData = new TestData();
using ( var reader = MockIDataReader() )
{
while ( reader.Read() )
{
testData = new TestData
{
ValidChar = reader.GetChar( "Char" ).Value
};
}
}
return testData;
}
你的是,当我在做GetTestData的reader.Read问题()方法它总是空的。我需要知道如何做类似的东西。
The issue you is when I do reader.Read in my GetTestData() method its always empty. I need to know how to do something like
reader.Stub( x => x.Read() ).Repeat.Once().Return( true )
推荐答案
起订量具有执行方法之后运行一些代码的能力。这就是所谓的回调。
修改代码,这样一来,也将努力:
Moq has an ability to run some code after the method is executed. It is called "Callback". Modify your code this way and it will work:
private IDataReader MockIDataReader()
{
var moq = new Mock<IDataReader>();
bool readToggle = true;
moq.Setup(x => x.Read())
// Returns value of local variable 'readToggle' (note that
// you must use lambda and not just .Returns(readToggle)
// because it will not be lazy initialized then)
.Returns(() => readToggle)
// After 'Read()' is executed - we change 'readToggle' value
// so it will return false on next calls of 'Read()'
.Callback(() => readToggle = false);
moq.Setup(x => x["Char"])
.Returns('C');
return moq.Object;
}
private class TestData
{
public char ValidChar { get; set; }
}
private TestData GetTestData()
{
var testData = new TestData();
using ( var reader = MockIDataReader() )
{
testData = new TestData
{
ValidChar = (Char)reader["Char"]
};
}
return testData;
}
但是,如果将需要的IDataReader包含不仅单列,但一些?好了,下面是一个例子:
But what if it will be required IDataReader to contain not only single row, but several? Well, here is a sample:
// You should pass here a list of test items, their data
// will be returned by IDataReader
private IDataReader MockIDataReader(List<TestData> ojectsToEmulate)
{
var moq = new Mock<IDataReader>();
// This var stores current position in 'ojectsToEmulate' list
int count = -1;
moq.Setup(x => x.Read())
// Return 'True' while list still has an item
.Returns(() => count < ojectsToEmulate.Count - 1)
// Go to next position
.Callback(() => count++);
moq.Setup(x => x["Char"])
// Again, use lazy initialization via lambda expression
.Returns(() => ojectsToEmulate[count].ValidChar);
return moq.Object;
}
这篇关于如何使用起订量来模拟一个SqlDataReader的 - 更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!