我是Moq的新手,我有这样的测试功能:
using Moq;
using Xunit;
namespace MyTest
{
public class UseMoq
{
public interface IFoo
{
string Name { get; set; }
}
[Fact]
public static void UseMock()
{
var mock = new Mock<IFoo>();
mock.SetupSet(foo => foo.Name = "foo");
mock.VerifySet(foo => foo.Name = "foo");
}
}
}它运行并失败,说:
Message:
Moq.MockException :
Expected invocation on the mock at least once, but was never performed: foo => foo.Name = "foo"
Performed invocations:
Mock<UseMoq.IFoo:1> (foo):
No invocations performed.
Stack Trace:
Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage)
Mock.VerifySet(Mock mock, LambdaExpression expression, Times times, String failMessage)
Mock`1.VerifySet(Action`1 setterExpression)
... ...这个错误信息实际上意味着什么,以及如何修复它?
发布于 2020-03-08 04:19:56
模拟框架正在按照设计的方式运行。
您正在对未被调用的模拟成员调用“验证”。这就是为什么在显示的示例中出现错误的原因。
mock.SetupSet(foo => foo.Name = "foo"); //<--Setup expectation
mock.VerifySet(foo => foo.Name = "foo"); //<--Verify expectation因为安装程序告诉模拟框架期望某些行为,但是
不执行调用。
如失败消息所述
至少在模拟上预期调用一次,但从未执行: foo => foo.Name = "foo“
也就是说,通常在测试用例的断言阶段中调用的Verify*方法。到那时,模拟将被一些被测试的主体用作依赖项,被模拟的成员在行使被测试的主体时会按预期调用。
//Arrange
//...initialize mock...
mock.SetupSet(foo => foo.Name = "foo"); //<--Setup expectation
//Act
//...subject under test uses mock
//Assert
mock.VerifySet(foo => foo.Name = "foo"); //<--Verify expectation查看MOQ Quickstart:核查以获得更多示例。
发布于 2020-03-07 14:30:10
它失败是因为您没有实现,要测试属性值的更改,必须通过实现而不是通过接口来更改它。
也许这个例子对你有帮助
public class UseMoq
{
public interface IFoo
{
string Name { get; set; }
}
public class Foo : IFoo
{
private readonly IFoo _foo;
public Foo(IFoo foo)
{
_foo = foo;
}
public string Name { get; set; }
public string GetName()
{
return _foo.Name;
}
public void SetName(string name)
{
_foo.Name = name;
}
}
[Fact]
public static void UseMock()
{
var mock = new Mock<IFoo>();
mock.SetupGet(x => x.Name).Returns("foo");
var fooName = new Foo(mock.Object).GetName();
mock.VerifyGet(m => m.Name, Times.Once);
/*
* Another TestMethod
*/
new Foo(mock.Object).SetName("new Foo Name");
mock.VerifySet(m => m.Name = "new Foo Name",Times.Once);
}
}https://stackoverflow.com/questions/60577967
复制相似问题