- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个代码,我必须为其编写单元测试。由于我是单元测试的新手,因此我正在寻求您的帮助。我想测试 IsAdmin 方法,该方法获取 CloudTableClient 和字符串作为输入,但我真的不知道如何处理它。我尝试了下面的代码,但失败并显示消息:
Message: Test method UnitTestMatan.UserControllerTests.IsAdmin_NotOnTheList_ReturnFalse threw exception: System.MethodAccessException: Attempt by method 'MatanWebServer.Controllers.UserController.IsAdmin(Microsoft.WindowsAzure.Storage.Table.CloudTableClient, System.String)' to access method 'Microsoft.WindowsAzure.Storage.Table.CloudTable.ExecuteQuery(Microsoft.WindowsAzure.Storage.Table.TableQuery, Microsoft.WindowsAzure.Storage.Table.TableRequestOptions, Microsoft.WindowsAzure.Storage.OperationContext)' failed.
基本上,我要测试的第一件事是,当 IsAdmin 收到不在表中的电子邮件或只是一个随机字符串时,它会返回 false。在测试部分,我想使用 UserController 中生成的表,而不是新建一个表。
以下是我需要测试的类:
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using ParseMatanDataWebJob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace MatanWebServer.Controllers
{
public class UserController : ApiController
{
// GET: api/user
[AdminAuthorizeAttribute]
public IEnumerable<string> Get()
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=matandata;AccountKey=myconnectionstringthatidontwantyoutoknow");
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
IEnumerable<string> EmailsList = GetAllEmails(tableClient);
return (EmailsList);
}
// GET: api/user/5
[UserAuthorizeAttribute]
public ReturnObjectValuescontroller Get(string email)
{
// Retrieve the storage account from the connection string.p
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myconnectionstringthatidontwantyoutoknow");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
var result = new ReturnObjectValuescontroller();
result.isAdmin = IsAdmin(tableClient, email);
// Create the CloudTable object that represents the "people" table.
CloudTable donationsTable = tableClient.GetTableReference("userdonationsdata");
// Create the table query.
TableQuery<DonationData> userDonationsQuery = new TableQuery<DonationData>().Where(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, email.ToString()));
var DonationsResult = donationsTable.ExecuteQuery(userDonationsQuery).ToList();
result.DonationsList = DonationsResult;
return result;
}
public static bool IsAdmin(CloudTableClient tableClient, string email)
{
CloudTable AdminsTable = tableClient.GetTableReference("matanadminusers");
TableQuery AdminsListQuery = new TableQuery();
AdminsListQuery.SelectColumns = new List<string>() { "AdminEmail" };
var TableEntityAdminsList = AdminsTable.ExecuteQuery(AdminsListQuery).ToList();
List<string> AdminsEmailList = new List<string>();
foreach (var item in TableEntityAdminsList)
{
AdminsEmailList.Add(item.Properties["AdminEmail"].StringValue);
}
return (AdminsEmailList.Contains(email, StringComparer.OrdinalIgnoreCase));
}
private IEnumerable<string> GetAllEmails(CloudTableClient tableClient)
{
CloudTable donationsTable = tableClient.GetTableReference("useremails");
TableQuery EmailsListQuery = new TableQuery();
EmailsListQuery.SelectColumns = new List<string>() { "RowKey" };
var DynamicEntityEmailsList = donationsTable.ExecuteQuery(EmailsListQuery).ToList();
List<string> EmailList = new List<string>();
foreach (var item in DynamicEntityEmailsList)
{
EmailList.Add(item.RowKey);
}
return EmailList.Distinct();
}
// POST: api/Rony
public void Post([FromBody]string value)
{
}
// PUT: api/Rony/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE: api/Rony/5
public void Delete(int id)
{
}
}
}
这是我为 IsAdmin 尝试的测试:
using System;
using MatanWebServer.Controllers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
namespace UnitTestMatan
{
[TestClass]
public class UserControllerTests
{
[TestMethod]
public void IsAdmin_NotOnTheList_ReturnFalse()
{
var userController = new UserController();
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myconnectionstringthatidontwantyoutoknow");
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
var result = UserController.IsAdmin(tableClient, "str");
Assert.IsFalse(result);
}
}
}
最佳答案
这更多的是“increddibelly”给出的关于使用接口(interface)的答案的后续。
让我们看下面的例子:
我有一个名为 Person 的类,它需要向数据库发送一些信息。然后,我将不在 Person 类中使用该逻辑,而是将其放在另一个类中。该类负责包含 Person 类与数据库通信所需的所有逻辑,这样的类通常称为数据访问层 (DAL) 或存储库。好的,举个例子:
Person 类:
public Person(IDALPerson d)
{
dal = d;
}
private IDALPerson dal;
public void SendOrder()
{
(Other logic...)
dal.SendOrder("Bananas");
}
所以这里Person类通过它的构造函数从程序中的另一个地方获取这个DAL(依赖),这是一种依赖注入(inject)。该 DAL 实现了 IDALPerson 接口(interface),因此具体的 DAL 类可以是:
public class PersonDAL : IDALPerson
{
public void SendOrder()
{
(logic for adding order)
}
}
然后,在执行测试时,您可以创建 IDALPerson 的模拟对象,这样在测试时,您的 Person 类实际上不使用数据库,然后您可以使用 Moq 框架获取一些信息,如“increddibelly”所述”,从而在不依赖数据库的情况下测试 SendOrder 函数。您的测试可能如下所示:
[Test]
public void SendOrderTest()
{
//Arrange
Mock<IDALPerson> MockDAL = new Mock<IDALPerson>();
Person p = new Person(MockDAL);
//Act
p.SendOrder();
//Assert
//Assert something.
}
关于c# - 对使用 Azure 云服务的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51878840/
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
从以下网站,我找到了执行java AD身份验证的代码。 http://java2db.com/jndi-ldap-programming/solution-to-sslhandshakeexcepti
似乎 melt 会使用 id 列和堆叠的测量变量 reshape 您的数据框,然后通过转换让您执行聚合。 ddply,从 plyr 包看起来非常相似..你给它一个数据框,几个用于分组的列变量和一个聚合
我的问题是关于 memcached。 Facebook 使用 memcached 作为其结构化数据的缓存,以减少用户的延迟。他们在 Linux 上使用 UDP 优化了 memcached 的性能。 h
在 Camel route ,我正在使用 exec 组件通过 grep 进行 curl ,但使用 ${HOSTNAME} 的 grep 无法正常工作,下面是我的 Camel 路线。请在这方面寻求帮助。
我正在尝试执行相当复杂的查询,在其中我可以排除与特定条件集匹配的项目。这是一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我正在尝试执行相当复杂的查询,我可以在其中排除符合特定条件集的项目。这里有一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我发现了很多嵌入/内容项目的旧方法,并且我遵循了在这里找到的最新方法(我假设):https://blog.angular-university.io/angular-ng-content/ 我正在尝试
我正在寻找如何使用 fastify-nextjs 启动 fastify-cli 的建议 我曾尝试将代码简单地添加到建议的位置,但它不起作用。 'use strict' const path = req
我正在尝试将振幅 js 与 React 和 Gatsby 集成。做 gatsby developer 时一切看起来都不错,因为它发生在浏览器中,但是当我尝试 gatsby build 时,我收到以下错
我试图避免过度执行空值检查,但同时我想在需要使代码健壮的时候进行空值检查。但有时我觉得它开始变得如此防御,因为我没有实现 API。然后我避免了一些空检查,但是当我开始单元测试时,它开始总是等待运行时异
尝试进行包含一些 NOT 的 Kibana 搜索,但获得包含 NOT 的结果,因此猜测我的语法不正确: "chocolate" AND "milk" AND NOT "cow" AND NOT "tr
我正在使用开源代码共享包在 iOS 中进行 facebook 集成,但收到错误“FT_Load_Glyph failed: glyph 65535: error 6”。我在另一台 mac 机器上尝试了
我正在尝试估计一个标准的 tobit 模型,该模型被审查为零。 变量是 因变量 : 幸福 自变量 : 城市(芝加哥,纽约), 性别(男,女), 就业(0=失业,1=就业), 工作类型(失业,蓝色,白色
我有一个像这样的项目布局 样本/ 一种/ 源/ 主要的/ java / java 资源/ .jpg 乙/ 源/ 主要的/ java / B.java 资源/ B.jpg 构建.gradle 设置.gr
如何循环遍历数组中的多个属性以及如何使用map函数将数组中的多个属性显示到网页 import React, { Component } from 'react'; import './App.css'
我有一个 JavaScript 函数,它进行 AJAX 调用以返回一些数据,该调用是在选择列表更改事件上触发的。 我尝试了多种方法来在等待时显示加载程序,因为它当前暂停了选择列表,从客户的 Angul
可能以前问过,但找不到。 我正在用以下形式写很多语句: if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 我想到了三元运算符,但我认
我有一个表单,在将其发送到 PHP 之前我正在执行一些验证 JavaScript,验证后的 JavaScript 函数会发布用户在 中输入的文本。页面底部的标签;然而,此消息显示短暂,然后消失...
我是一名优秀的程序员,十分优秀!