搜索了StackOverflow和谷歌我认为我正在做的事情是正确的,但结果似乎并不顺利
[TestMethod]
public void LoginAction_Should_Return_View_and_User_Authenticated()
{
// Arrange
var mock = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mock.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
var testData = FakeUserData.CreateTestUsers();
var repository = new FakeUserRepository(testData);
var controller = new AccountController(repository);
controller.ControllerContext = mock.Object;
// Act
var result = controller.Login("testuser1", "testuser1");
// Assert
Assert.AreEqual("testuser1", controller.HttpContext.Session["Username"]);
Assert.IsTrue((bool)controller.HttpContext.Session["IsAuthenticated"]);
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,controller.HttpContext.Session ["Username"]的值为null,但是我使用Session帮助器将值设置为用户名.我做错了什么,还是其他什么?任何帮助将不胜感激.
我无法弄清楚如何使用Moq在C#中设置索引器.Moq文档很薄弱,我已经做了很多搜索......我想做的事情在如何设置索引属性的解决方案中类似:
var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);
Run Code Online (Sandbox Code Playgroud)
我想修改上面的内容以适用于任何索引和任何值,所以我可以这样做:
someClass.Object.SomeIndexedProperty[1] = 5;
Run Code Online (Sandbox Code Playgroud)
目前我有以下内容,它对索引属性getter非常有用,但是如果我设置了值,Moq会忽略它:
var someValues = new int[] { 10, 20, 30, 40 };
var someClass = new Mock<ISomeClass>();
someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
.Returns<int>(index => someValues[index]);
// Moq doesn't set the value below, so the Assert fails!
someClass.Object.SomeIndexedProperty[3] = 25;
Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
Run Code Online (Sandbox Code Playgroud) 我有一些代码可以下载一些RSS源.
我一直在使用WebClient或Argotic.Syndication.RssFeed库.
但这些都不可模糊:(
我绝对不希望每次运行单元测试时都能看到真正的RSS提要.
有没有人对我能做什么有任何建议?
我需要创建一个邪恶的包装器吗?如果是这样..对此有何建议?
如果我尝试模拟包含如下async方法的类型:
interface Foo
{
Task<int> Bar();
}
Run Code Online (Sandbox Code Playgroud)
然后mock的Bar方法返回null.我猜Moq正在选择default(Task<int>)我的方法的默认返回值,这确实是null.然而,Moq应该选择像Task.FromResult(default(int))默认值这样的东西.我可以强制Moq使异步方法返回非空任务吗?
我是Moq的新手,一般都在测试,所以这是我的noobish Q.如何测试请求中的Status属性是否已使用Moq设置?
public class DudeManager
{
private readonly IDRepository _repo;
public DManager(IDRepository repo)
{
_repo = repo;
}
public void Create(Request r)
{
r.Status = Status.Submitted;
_repo.AddRequest(r);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有比以下更好的方法?也许使用VerifySet?
[TestMethod]
public void AddingNewRequestSetsStatusToSubmitted()
{
//Arrange
var mock = new Mock<IDRepository>();
var mockRequest = new Mock<Request>();
var dManager = new DManager(mock.Object);
//Act
dManager.Create(mockRequest.Object);
//Assert
Assert.AreEqual(Status.Submitted, mockRequest.Object.Status);
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在所有有用的建议后最终使用的方法:
//Arrange
var request = new Request();
var mock = new Mock<IDRepository>();
var dManager = new DManager(mock.Object);
mock.Setup(x …Run Code Online (Sandbox Code Playgroud) 我已经能够DbSet使用此链接模拟来自Moq的实体框架.
但是,我现在想知道如何模拟对SqlQuery的调用.不确定这是否可行或者如何依赖于模拟的db上下文知道正在调用什么"查询".
以下是我想要嘲笑的内容.
var myObjects = DbContext.Database
.SqlQuery<MyObject>("exec [dbo].[my_sproc] {0}", "some_value")
.ToList();
Run Code Online (Sandbox Code Playgroud)
我目前还没有尝试任何东西,因为不知道如何开始嘲笑这个例子.
的嘲讽DbSet是下方再次重申,我可以正确模拟返回DbSet的MyObject的,但现在我试图嘲弄返回列表SQLQuery对MyObject的.
var dbContext = new Mock<MyDbContext>();
dbContext.Setup(m => m.MyObjects).Returns(mockObjects.Object);
dbContext.Setup(m => m.Database.SqlQuery... something along these lines
Run Code Online (Sandbox Code Playgroud) 当我ReturnsAsync(null)在Visual Studio(with Moq)中使用C#单元测试方法时,我收到错误:
"以下方法或属性之间的调用不明确"
然后是ReturnsAsync具有不同参数的方法列表.我知道这是由于ReturnsAsync函数被重载.但是,当我在同事的计算机上运行相同的单元测试时,它运行没有任何错误.有谁知道为什么会这样?有谁知道如何解决这一问题?
此外,当我建立时,我收到警告:
所有引用********的软件包都必须安装nuget软件包Microsoft.Bcl.Build.
这会有什么影响吗?
假设我有一些通用方法的接口,没有参数:
public interface Interface {
void Method<T>();
}
Run Code Online (Sandbox Code Playgroud)
现在我希望实现这个类的模拟(我正在使用Moq),我希望模拟这个方法的一些具体类型 - 让我说我在嘲笑Method<String>()调用.
mock = new Mock<Interface>();
mock.Setup(x => x.Method ????).Returns(String("abc"));
Run Code Online (Sandbox Code Playgroud)
的想法????应该是明确的-这lambda表达式应该处理的情况时,T在Method<T>实际上是一个String.
有什么方法可以达到想要的行为吗?
是否可以断言是否已调用方法?我正在测试以下方法,我想声明_tokenManager.GetToken()已被调用.我只是想知道方法是否已被调用,因为该方法不返回值.我正在使用Moq.
谢谢,
代码段
public void Subscribe(string code, string emailAddress, string columnKey)
{
// Request authentication token
var token = _tokenManager.GetToken(code, false);
if (!_tokenValidator.Validate(token))
{
// Token has expired or invalid - refresh the token
token = _tokenManager.GetToken(code, true);
}
// Subscribe email
_silverpopRepository.Subscribe(token.AccessToken, emailAddress, columnKey);
}
Run Code Online (Sandbox Code Playgroud) 我如何模拟AsNoTracking方法?
在下面的示例中,DbContext已注入服务类.如果我从GetOrderedProducts方法中删除AsNoTracking扩展方法,但是AsNoTracking测试失败,因为它返回null,它工作正常.我也尝试过模拟AsNoTracking以返回正确的值,但它没有用.
public interface IUnitOfWork
{
IDbSet<TEntity> Set<TEntity>() where TEntity : class;
int SaveAllChanges();
}
public class Entites : DbContext, IUnitOfWork
{
public virtual DbSet<Product> Products { get; set; } // This is virtual because Moq needs to override the behaviour
public new virtual IDbSet<TEntity> Set<TEntity>() where TEntity : class // This is virtual because Moq needs to override the behaviour
{
return base.Set<TEntity>();
}
public int SaveAllChanges()
{
return base.SaveChanges();
}
}
public class ProductService
{
private readonly IDbSet<Product> …Run Code Online (Sandbox Code Playgroud) moq ×10
c# ×9
unit-testing ×5
mocking ×4
.net ×2
asp.net-mvc ×1
async-await ×1
asynchronous ×1
dbcontext ×1
generics ×1
indexer ×1
nunit ×1
webclient ×1