当我尝试设置模拟时,我收到此错误PropertyBehavior()
:
System.InvalidOperationException:System.InvalidOperationException:无效调用,最后一次调用已被使用或未进行任何调用(请确保您正在调用虚拟(C#)/ Overridable(VB)方法).
我试图只使用Rhino Mocks 3.5(安排,行动,断言)
这是我的代码:
private IAddAddressForm form;
private AddAddressMediator mediator;
[TestInitialize()]
public void MyTestInitialize()
{
form = MockRepository.GenerateMock<IAddAddressForm>();
mediator = new AddAddressMediator(form);
// Make the properties work like a normal property
Expect.Call(form.OKButtonEnabled).PropertyBehavior();
//I tried this too. I still get the exception
//SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
}
[TestMethod]
public void TestOKButtonEnabled()
{
form.OKButtonEnabled = true;
Assert.IsTrue(form.OKButtonEnabled);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用存根(对于我应该使用的代码),但我正在尝试学习Rhino Mocks.
最终,我希望能够确保访问多个属性的值.(关于如何检查form.FirstName
访问的任何提示(即调用getter)也将不胜感激.)
如果需要,以下代码IAddressForm
:
namespace AddressBook
{
public interface IAddAddressForm
{
string FirstName { get; set; …
Run Code Online (Sandbox Code Playgroud) c# rhino-mocks visual-studio-2008 visual-studio rhino-mocks-3.5
我意识到有一些帖子,比如这个问过同样的问题.但是,建议页面上的链接不起作用(它只是让我回到博客主页).
我正在寻找的是一个没有任何假设的先前犀牛模拟知识的教程.
我需要的是一步一步的指导,这也解释了基础(存根VS嘲笑VS expect.call),怎么Record()
,ReplayAll()
,VerifyAll()
,当/为什么你使用Repeat.Any()
等工作.
在阅读了一些文档(我发现一些文章很有用但最多让人感到困惑)后,我有一个粗略的理解,但我需要更多的例子,详细解释如何使用rhino模拟.
我试图在存储库上设置期望.该方法使用params关键字:
string GetById(int key, params string[] args);
Run Code Online (Sandbox Code Playgroud)
我设定的期望:
var resourceRepo = MockRepository.GenerateMock<IResourceRepository>();
resourceRepo.Expect(r => r.GetById(
Arg<int>.Is.Equal(123),
Arg<string>.Is.Equal("Name"),
Arg<string>.Is.Equal("Super"),
Arg<string>.Is.Equal("Mario"),
Arg<string>.Is.Equal("No"),
Arg<string>.Is.Equal("Yes"),
Arg<string>.Is.Equal("Maybe")))
.Return(String.Empty);
Run Code Online (Sandbox Code Playgroud)
抛出此异常:
测试方法XYZ引发异常:System.InvalidOperationException:在记录时在模拟方法调用中仅使用Arg.预计有2个参数,已经定义了7个.
设定我的期望有什么问题?
如果我正在嘲笑一个类,如下所示,有什么方法可以让模拟不重写虚方法?我知道我可以简单地删除虚拟修饰符,但我实际上想要稍后删除此方法的行为.
换句话说,除了删除虚拟修饰符之外,我怎么能让这个测试通过:
namespace Sandbox {
public class classToMock {
public int IntProperty { get; set; }
public virtual void DoIt() {
IntProperty = 1;
}
}
public class Foo {
static void Main(string[] args) {
classToMock c = MockRepository.GenerateMock<classToMock>();
c.DoIt();
Assert.AreEqual(1, c.IntProperty);
Console.WriteLine("Pass");
}
}
Run Code Online (Sandbox Code Playgroud)
}
我正在使用Rhino Mocks 3.5模拟一个服务方法调用,该调用需要2个参数,我想确保正确设置对象上的某个属性.
// Method being tested
void UpdateDelivery( Trade trade )
{
trade.Delivery = new DateTime( 2013, 7, 4 );
m_Service.UpdateTrade( trade, m_Token ); // mocking this
}
Run Code Online (Sandbox Code Playgroud)
这是我的一部分代码(有效)
service, trade, token declared / new'd up ... etc.
...
using ( m_Mocks.Record() )
{
Action<Trade, Token> onCalled = ( tradeParam, tokenParam ) =>
{
// Inspect / verify that Delivery prop is set correctly
// when UpdateTrade called
Assert.AreEqual( new DateTime( 2013, 7, 4 ), tradeParam.Delivery );
};
Expect.Call( …
Run Code Online (Sandbox Code Playgroud) 我试图用RhinoMocks声明某个属性设置器被调用.但它没有按预期工作.
以下简化示例说明了该问题.
考虑这个界面:
public interface IMyInterface
{
string SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在考虑以下代码:
var mock = MockRepository.GenerateStub<IMyInterface>();
mock.SomeProperty = "abc";
mock.AssertWasCalled(x => x.SomeProperty = Arg<string>.Is.Anything);
Run Code Online (Sandbox Code Playgroud)
我期待最后一行的断言会毫无问题地通过.但是,它正在抛出ExpectationViolationException
这条消息:
"IMyInterface.set_SomeProperty(任何东西);预期#1,实际#0."
我不明白为什么会发生这种情况.有人可以帮忙吗?
我目前有一个存储库,它使用Entity Framework进行我的CRUD操作.
这是注入我需要使用此repo的服务.
使用AutoMapper,我将实体Model投影到Poco模型上,并且服务返回poco.
如果我的对象有多个属性,那么设置然后断言我的属性的正确方法是什么?
如果我的服务有多个repo依赖项,那么设置我所有模拟的正确方法是什么?* - 一个类[setup],其中为这些测试装置配置了所有的模拟和对象?*****
我想避免进行10次测试,每次测试在属性上有50个断言,并且每次测试都有几十个模拟设置.这使得可维护性和可读性变得困难.
我已阅读Art of Unit Testing,但没有发现任何有关如何处理此案例的建议.
我使用的工具是Rhino Mocks和NUnit.
我也在SO上发现了这个,但它没有回答我的问题:正确的单元测试服务/存储库交互
这是一个表达我所描述内容的示例:
public void Save_ReturnSavedDocument()
{
//Simulate DB object
var repoResult = new EntityModel.Document()
{
DocumentId = 2,
Message = "TestMessage1",
Name = "Name1",
Email = "Email1",
Comment = "Comment1"
};
//Create mocks of Repo Methods - Might have many dependencies
var documentRepository = MockRepository.GenerateStub<IDocumentRepository>();
documentRepository.Stub(m => m.Get()).IgnoreArguments().Return(new List<EntityModel.Document>()
{
repoResult
}.AsQueryable());
documentRepository.Stub(a => a.Save(null, null)).IgnoreArguments().Return(repoResult);
//instantiate service and inject repo
var documentService = …
Run Code Online (Sandbox Code Playgroud)