首先,我知道这个问题非常危险: 如何在C#中进行单元测试中的MapPath
但我希望它有一个不同的解决方案.我的问题如下:
在我的代码中,我有一个需要验证的对象.我正在为每个验证方法创建单元测试,以确保它正确验证.我正在创建模拟数据并将其加载到对象中,然后验证它.问题是在验证过程中,当发生错误时,会分配错误代码.此错误代码用于使用Server.MapPath从xml文件收集有关错误的信息.但是,在尝试获取xml文件时,会抛出异常,这意味着无法找到该文件.
由于MapPath在我的验证代码中,而不是我的单元测试,如何让我的单元测试识别路径?这个问题有意义吗?
错误行(在我的验证码中不是我的单元测试):
XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));
Run Code Online (Sandbox Code Playgroud)
简化:单元测试在我的程序中调用一个调用Server.MapPath然后失败的方法.
我目前有一个非常大的代码库的Xcode项目,我称之为Project X,我将其划分为一堆子项目(项目A,B,C).
到目前为止,这些项目中的每一个都可以自行编译.它们都产生静态库.项目B和项目C依赖于项目A生成的静态库以进行构建.
我有另一个xcode项目,Project Z,它需要Projects B和C生成的静态库.这就是问题所在.当Project Z进入链接器阶段时,事情就会爆发 - 在项目B和C的库中找到重复的符号,用于它们最初在项目A中链接的代码!
我对静态库世界很陌生,我不确定如何推进Project Z,或者如何修改其他项目以便它们链接到同一个Project A lib.我觉得这是不可能的.我有什么选择?
编辑:
我应该澄清,项目B和项目C需要构建成单独的静态库,因为一些客户端只需要一个或另一个.
此外,我在OSX和iOS平台上都遇到了这种困境.
我意识到我可以通过将项目构建为动态库来解决OSX上的这个问题.但是,我不想这样做,它仍然让我在iOS上遇到同样的问题.
我正在尝试在shell脚本中创建一个函数,该脚本接受命令并使用eval执行它,然后根据命令的成功进行一些后处理.不幸的是,代码的行为并不像我期望的那样.这就是我所拥有的:
#!/bin/sh
...
function run_cmd()
{
# $1 = build cmd
typeset cmd="$1"
typeset ret_code
eval $cmd
ret_code=$?
if [ $ret_code == 0 ]
then
# Process Success
else
# Process Failure
fi
}
run_cmd "xcodebuild -target \"blah\" -configuration Debug"
Run Code Online (Sandbox Code Playgroud)
当命令($cmd)成功时,它工作正常.当命令失败时(例如编译错误),脚本会在我处理失败之前自动退出.有没有办法可以阻止eval退出,还是有一种不同的方法可以让我实现我想要的行为?
我正在使用一个依赖于REQUIRE宏来执行断言的单元测试框架.
简化后,宏的工作原理如下:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, "REQUIRE" )
Run Code Online (Sandbox Code Playgroud)
其定义与此类似:
#define INTERNAL_REQUIRE( expr, macroName ) \
PerformAssertion( macroName, #expr, expr );
Run Code Online (Sandbox Code Playgroud)
PerformAssertion前两个参数的类型如下:const char*.第二个参数(#expr)的原因是可以记录断言的确切表达式.这就是问题所在.预处理器在将表达式作为a传递之前展开表达式const char *,因此它与最初声明的表达式不同.
例如:
REQUIRE( foo != NULL );
Run Code Online (Sandbox Code Playgroud)
会导致此次通话:
PerformAssertion( "REQUIRE", "foo != 0", foo != 0 );
Run Code Online (Sandbox Code Playgroud)
如您所见,表达式已部分展开,例如表达式foo != NULL在日志中显示为foo != 0.的NULL(这是定义为一个宏0)通过C预处理构建断言消息文本之前扩大.有没有办法可以忽略或绕过消息文本的扩展?
编辑:这是解决方案,对任何好奇的人:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )
#define INTERNAL_REQUIRE( expr, exprString, macroName ) …Run Code Online (Sandbox Code Playgroud) 情况(忽略它很无聊):我有使用报告服务创建的报告.其中一些报告采用参数"月".他们输入他们想要的月份的整数.示例:December = 12.为了查看报告,我只是在visual studio中使用Report Viewer.我需要将月份字段作为下拉框,以便按名称选择月份.报告服务中有一个功能,允许您将字段绑定到存储过程,以便为下拉列表创建值/文本对.
问题:我不想在我的数据库中创建一个"月"表,但我需要一个可以返回所有月/ int对的存储过程.我确信有一个非常简单的解决方案,但我不确定它是什么!我的第一个想法是创建一个临时表,但我不知道如何添加手动添加每个月/ int对表...所有的建议表示赞赏!
我想要的是以下声明,除了不使用月表:
SELECT MonthID, MonthName
FROM Months
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个需要一些文本资源的城域应用程序.构建过程的一部分是将所有这些资源复制到应用程序安装目录中的文件夹中.我想做的是收集这些资源文件的列表,并相应地处理每个文件.不幸的是,我这样做的尝试并不成功.
由于我正在为WinRT构建,我无法使用非常有用的"FindFirstFile"和"FindNextFile"函数.我一直在尝试使用WinRT异步文件IO操作完成工作.
auto getResourceFolder = installedLocation->GetFolderFromPathAsync( folderPath );
getResourceFolder->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler< Windows::Storage::StorageFolder^ >(
[this]( Windows::Foundation::IAsyncOperation< Windows::Storage::StorageFolder^ >^ operation ) {
if( operation->Status == Windows::Foundation::AsyncStatus::Completed ) {
auto resourceFolder = operation->GetResults();
auto getResourceFiles = resourceFolder->GetFilesAsync();
getResourceFiles->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler< IVectorView< Windows::Storage::IStorageFile^ >^ >(
[this]( Windows::Foundation::IAsyncOperation< IVectorView< Windows::Storage::IStorageFile^ >^ >^ operation ) {
if( operation->Status == Windows::Foundation::AsyncStatus::Completed ) {
auto resourceFiles = operation->GetResults();
for( unsigned int i = 0; i < resourceFiles->Size; ++i ) {
// Process File
} …Run Code Online (Sandbox Code Playgroud) visual-c++ microsoft-metro windows-runtime c++-cx visual-c++-2012
.net ×1
c# ×1
c++ ×1
c++-cx ×1
eval ×1
exit ×1
linker ×1
macros ×1
sh ×1
sql ×1
sql-server ×1
t-sql ×1
unit-testing ×1
visual-c++ ×1
xcode ×1
xcodebuild ×1