我正在尝试使用Moq来模拟我的某些存储库调用,并且我产生的大多数单元测试都运行良好,但是我遇到了无法正确模拟的情况。
需要模拟的我的存储库调用具有以下签名:
IEnumerable<T> Get(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "");
Run Code Online (Sandbox Code Playgroud)
我正在进行单元测试的方法如下:
public bool CheckForTaskUsage(int taskId)
{
return _taskInstanceRepository.Get(x => x.Task.Id == taskId).Any();
}
Run Code Online (Sandbox Code Playgroud)
单元测试如下:
Task task_1 = new Task() { Id = 1 };
TaskInstance taskInstance_1 = new TaskInstance() { Id = 1, Task = task_1 };
_domainTaskInstances = new List<TaskInstance>() { taskInstance_1 };
[TestMethod()]
public void TaskService_CheckForTaskUsage_Success()
{
int taskId = 1;
//_taskInstanceRepository.Setup(x => x.Get(y => y.Task.Id == taskId,null,""))
// .Returns(_domainTaskInstances); …Run Code Online (Sandbox Code Playgroud) 我正在尝试为一个简单的mvc控制器编写单元测试,该控制器对数据库进行复杂的LINQ查询:
public class HomeController
{
private readonly DamagesDbContext db;
public HomeController(DamagesDbContext db)
{
this.db = db;
}
// GET: /Home/
[Authorize]
public ActionResult Index()
{
var dashData = (from inc_c in db.incident_content
join inc in db.incidents
on inc_c.incidentid equals inc.incidentid
where inc.currentrevisionnumber == inc_c.revisionnumber
group inc_c by 1 into g
select new{
total = g.Count(),
open = g.Count(q => q.incidentstatus == "OPEN"),
closed = g.Count(q => q.incidentstatus == "CLOSED")
}).SingleOrDefault();
ViewBag.total = dashData.total;
ViewBag.open = dashData.open;
ViewBag.closed = dashData.closed;
return …Run Code Online (Sandbox Code Playgroud) 例如,您正在测试getSomeString.
public class Class1
{
public Class1() {}
public string getSomeString(string input)
{
//dosomething
OtherClass class = new OtherClass();
return class.getData();
}
}
public class OtherClass
{
public OtherClass() {/*some data*/}
public string getData()
{
//do something
string aString = getAString(Input);
//do something
}
public virtual string getAString(string input);
{
//do something to be mocked
return somethingToBeMocked;
}
}
Run Code Online (Sandbox Code Playgroud)
所以你需要单元测试来模拟出来getAString.你怎么做到这一点?
我试过只是模拟getAString并希望测试使用模拟值,但这不起作用.
我试过模拟Class1并将单元测试设置为class1模拟对象,但我无法弄清楚如何使模拟getAString传递给模拟class1.
我无法弄清楚该怎么做.
我有一个我正在测试的课程.此类使用接口中的take作为构造函数参数.此接口具有一个具有out参数的方法.
我想要做的是模拟这个方法,以便out参数始终是一个特定的值.
如何才能做到这一点?
我希望有可能.Object通过Moq中的扩展方法操作模拟,但我没有找到任何适用的扩展方法.
例如:
interface IFoo
{
void Bar();
}
/* ... */
var mock = Mock<IFoo>();
mock.Verify(x => x.Bar());
IFoo foo = mock.Object;
foo.Verify(x => x.Bar()); // this does not compile!
Run Code Online (Sandbox Code Playgroud)
反正我是否可以编写上面的代码(不编译的代码?)如果没有,为什么不呢?
我试图在循环中设置一个模拟对象,它将为具有不同参数的函数调用返回不同的值:
var myMock= new Mock<IInterface>();
for (int i = 0; i < fromKeys.Count; ++i)
{
var value= new[] {new[] {1.0 + i}};
_values.Add(value);
myMock.Setup(x => x.Provide(fromKeys[i])).Returns(new Sth(fromKeys[i], value));
}
_myObject = myMock.Object;
Run Code Online (Sandbox Code Playgroud)
但是当我Provide使用生产代码中的第一个键调用时(而不是在测试设置期间),它会崩溃:
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, ref SignatureStruct sig, MethodAttributes …Run Code Online (Sandbox Code Playgroud) 我是C#Moq(过去使用过Rhino Mochs)的新手,需要测试一系列对同一方法的调用.我发现这个很酷的解决方案可以测试一系列返回值:
http://haacked.com/archive/2009/09/29/moq-sequences.aspx/
public static class MoqExtensions
{
public static void ReturnsInOrder<T, TResult>(this ISetup<T, TResult> setup,
params TResult[] results) where T : class {
setup.Returns(new Queue<TResult>(results).Dequeue);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是在对同一方法的一系列调用中测试作为参数发送的值(而不是它返回的值).
粗略轮廓......
var expression = new MyExpressionThing();
processor.Setup(x => x.Execute(expected1)).Verifiable();
processor.Setup(x => x.Execute(expected2)).Verifiable();
processor.Setup(x => x.Execute(expected3)).Verifiable();
expression.ExecuteWith(processor.Object);
processor.Verify();
Run Code Online (Sandbox Code Playgroud)
这是我尝试过但我得到的例外情况:
"System.ArgumentException:无效的回调.带参数的方法(String,Object [])上的设置无法使用参数(String)调用回调."
// Arrange
var processor = new Mock<IMigrationProcessor>();
IList<string> calls = new List<string>();
processor.Setup(p => p.Execute(It.IsAny<string>()))
.Callback<string>(s => calls.Add(s));
// Act
var expr = new ExecuteScriptsInDirectoryExpression { SqlScriptDirectory …Run Code Online (Sandbox Code Playgroud) 我试图了解Exactly Verify或VerifyAll的作用?
我正在搜索,我得到了关于使用MOQ的以下信息
Arrange
Mock
Set up expectations for dependencies
Set up expected results
Create class under test
Act
Invoke method under test
Assert
Assert actual results match expected results
Verify that expectations were met
Run Code Online (Sandbox Code Playgroud)
那么验证究竟做了什么?我可以使用Assert测试所有内容,如果有任何失败,单元测试将失败?
验证还有哪些额外的工作?它是Assert的替代品吗?
更多澄清会让我理解.
谢谢
我有以下抽象类和测试方法.使用"Moq"我得到以下错误:
我的Abstact课程:
public abstract class UserProvider
{
public abstract UserResponseObject CreateUser(UserRequestObject request, string userUrl);
public abstract bool IsUserExist(UserRequestObject request, string userUrl);
}
Run Code Online (Sandbox Code Playgroud)
测试类:
[TestMethod()]
public void CreateUserTest()
{
var mockUserProvider = new Mock<UserProvider>(MockBehavior.Loose);
//GetUserRequestObject is local method to set data
mockUserProvider.
Setup(u => u.CreateUser(GetUserRequestObject(), ""))
.Returns(new UserResponseObject { uid = "123", uri = userUri }).Verifiable();
var userProvider = mockUserProvider.Object.CreateUser(GetUserRequestObject(), "");
mockUserProvider.Verify(u => u.CreateUser(GetUserRequestObject(), ""));
}
Run Code Online (Sandbox Code Playgroud)
错误信息 :
Moq.MockException:模拟上的预期调用至少一次,但从未执行过:u => u.CreateUser(.GetUserRequestObject(),"")
有人请解释一下,为什么我收到这条消息以及如何解决?
为了验证该方法是否被调用,我们应该使这个方法可以验证:
// arrange
mock
.Setup(foo => foo.SomeMethod("param1", "param2", "param3", "param4"))
.Verifiable();
Run Code Online (Sandbox Code Playgroud)
然后我们可以这样做:
// assert
mock
.Verify(foo => foo.SomeMethod("param1", "param2", "param3", "param4"));
Run Code Online (Sandbox Code Playgroud)
我想避免这个重复的代码...在复杂测试的情况下,代码变得过载且不可读.
所以我的问题是如何在排列部分中制作可验证的所有方法(带有任何参数)?
我知道VerifyAll():
// assert
mock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)
但它有一个缺点:实际验证的是不明显的.所以我正在寻找一些替代方案.