public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
var queueableMessage = CreateSingleQueueableMessage();
var message = queueableMessage[0];
var xml = QueueableMessageAsXml(queueableMessage);
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable();
//messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object);
var loggerStub = new Mock<ILogger>();
var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});
//messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once());
messageServiceClientMock.Verify();
}
Run Code Online (Sandbox Code Playgroud)
我开始使用Moq并且有点挣扎.我正在尝试验证messageServiceClient是否正在接收正确的参数,这是一个XmlElement,但我找不到任何方法使它工作.它仅在我不检查特定值时才有效.
有任何想法吗?
部分答案:我找到了一种方法来测试发送给代理的xml是否正确,但我仍然认为这不是正确的方法.
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
var loggerStub …Run Code Online (Sandbox Code Playgroud) 想象一下这堂课
public class Foo {
private Handler _h;
public Foo(Handler h)
{
_h = h;
}
public void Bar(int i)
{
_h.AsyncHandle(CalcOn(i));
}
private SomeResponse CalcOn(int i)
{
...;
}
}
Run Code Online (Sandbox Code Playgroud)
Mo(q)cking Handler在Foo的测试中,我怎样才能检查Bar()传递给了_h.AsyncHandle什么?
我在使用Moq的测试中有一些代码:
public class Invoice
{
...
public bool IsInFinancialYear(FinancialYearLookup financialYearLookup)
{
return InvoiceDate >= financialYearLookup.StartDate && InvoiceDate <= financialYearLookup.EndDate;
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以在单元测试中我试图模拟这个方法并让它返回true
mockInvoice.Setup(x => x.IsInFinancialYear()).Returns(true);
Run Code Online (Sandbox Code Playgroud)
无论如何都要写这行,所以我不必指定输入IsInFinancialYear.即.所以它在代码中没有输入参数是什么,它将返回true传递给它的什么?
我对C#中的单元测试相当新,并且学习使用Moq.以下是我要测试的课程.
class MyClass
{
SomeClass someClass;
public MyClass(SomeClass someClass)
{
this.someClass = someClass;
}
public void MyMethod(string method)
{
method = "test"
someClass.DoSomething(method);
}
}
class Someclass
{
public DoSomething(string method)
{
// do something...
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的TestClass:
class MyClassTest
{
[TestMethod()]
public void MyMethodTest()
{
string action="test";
Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
mockSomeClass.SetUp(a => a.DoSomething(action));
MyClass myClass = new MyClass(mockSomeClass.Object);
myClass.MyMethod(action);
mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Expected invocation on the mock at least once, but was never performed …Run Code Online (Sandbox Code Playgroud) 目的是Verifiable()什么?
如果我验证Mock并将其保留,它仍会验证SetUp.
编辑:我正在使用VerifyAll()因此验证一切的原因.更改为Verify()只有我的.Verifiable() SetUps被检查.
我陷入了这个代码,我不知道如何模拟:
ConfigurationManager.AppSettings["User"];
Run Code Online (Sandbox Code Playgroud)
我必须模拟ConfigurationManager,但我没有线索,我正在使用Moq.
有人可以给我一个提示吗?谢谢!
不知道如何解决这个问题,尝试对方法"GetByTitle"进行单元测试
以下是我的定义:
public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
public IArticle GetByTitle(string title)
{
IQuery query = Session.CreateQuery("...")
return query.UniqueResult<IArticle>();
}
}
public interface IArticleDAO
{
IArticle GetByTitle(string title);
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
[Test]
public void can_load_by_title()
{
_mockDaoFactory.Setup(x => x.GetArticleDao())
.Returns(_mockArticleDao.Object);
_mockArticleDao.Setup(x => x.GetByTitle("some title"))
.Returns(article1.Object);
_articleManager.LoadArticle("some title");
Assert.IsNotNull(_articleManager.Article);
}
Run Code Online (Sandbox Code Playgroud)
运行测试给出了错误:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Run Code Online (Sandbox Code Playgroud)
更新
我[Setup]看起来像:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager …Run Code Online (Sandbox Code Playgroud) 给出以下界面:
public interface IFoo
{
bool Foo(string a, bool b = false);
}
Run Code Online (Sandbox Code Playgroud)
试图用Moq模拟它:
var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);
Run Code Online (Sandbox Code Playgroud)
在编译时出现以下错误:
表达式树可能不包含使用可选参数的调用或调用
我发现上面的问题是Moq问题列表中的一个增强,它似乎被分配到4.5版本(无论何时).
我的问题是:鉴于上述内容不会很快得到解决,我该怎么办?我的选项是否只是在每次模拟它时显式设置可选参数的默认值(哪种类型在第一时间指定一个失败)或创建没有bool的重载(就像我会做的那样)在C#4之前)?
或者有没有人遇到过更聪明的方法来克服这个问题?
如何使用Moq验证方法是否只调用一次?在Verify()对Verifable()东西实在是令人困惑的.
[TestMethod]
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context
.Setup(c => c.Request)
.Returns(request.Object);
HomeController controller = new HomeController();
controller.HttpContext = context; //Here I am getting an error (read only).
...
}
Run Code Online (Sandbox Code Playgroud)
我的基本控制器有一个重写的Initialize,它得到了这个requestContext.我试图通过这个,但我没有做正确的事情.
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
}
Run Code Online (Sandbox Code Playgroud)
在哪里可以获得有关使用Moq模拟我的RequestContext和HttpContext的更多信息?我正在尝试模拟cookie和一般上下文.
moq ×10
c# ×8
mocking ×3
unit-testing ×3
nunit ×2
.net ×1
asp.net-mvc ×1
httpcontext ×1
methods ×1
nhibernate ×1
resharper ×1
testing ×1